2014-12-31 2 views
0

Я хочу, чтобы переместить следующую функцию из формы в модуль, потому что я планирую использовать эту функцию из разных «мест»:GetManifestResourceStream в модуле

Public Function StreamFromResource(ByVal uFilename As String) As Stream 

    Dim nAssembly As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly() 

    Dim s As Stream = nAssembly.GetManifestResourceStream(Me.GetType, uFilename) 
    Debug.Assert(Not s Is Nothing) 

    Return s 

End Function 

Однако, VB.NET говорит мне, что «мне» недействительна в модуле. Может ли кто-нибудь сказать мне обходное решение?

Спасибо!

+0

Me относится к текущему/локальному объекту, который не является модулем. Он должен работать, чтобы передать 'Me' процедуре As Object или Type avalable – Plutonix

ответ

0

Понял:

Public Function StreamFromResource(ByVal uFilename As String) As Stream 

    Dim nAssembly As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly() 

    Dim s As Stream = nAssembly.GetManifestResourceStream(System.Reflection.MethodBase.GetCurrentMethod.DeclaringType, uFilename) 
    Debug.Assert(Not s Is Nothing) 

    Return s 

End Function 
0

Там нет ничего плохого с решением публикуемого, но маятник качнулось в другую крайность: теперь он может быть использован только из модуля. Вот некоторые гибкие способы сделать это:

' no need for Public 
Friend Function GetResourceStream(obj As Object, filName As String) As Stream 

    Dim t As Type = obj.GetType 
    Dim asm As Assembly = t.Assembly 
    Dim s As Stream = asm.GetManifestResourceStream(t, filName) 

    Return s 
End Function 

' usage: 
Dim ss As Stream = GetResourceStream(Me, strFile) 

Еще более многоразовым являются Extensions:

<Extension> 
Friend Function GetResourceStream(obj As Object, filName As String) As Stream 

    Dim T As Type = obj.GetType 
    Dim asm As Assembly = T.Assembly 
    Dim s As Stream = asm.GetManifestResourceStream(T, filName) 

    Return s 
End Function 

<Extension> 
Friend Function GetResourceStream(T As Type, filName As String) As Stream 

    Dim asm As Assembly = T.Assembly 
    Dim s As Stream = asm.GetManifestResourceStream(T, filName) 
    Return s 

End Function 

Первым является самым простым, но только грузы из этой сборки:

Dim s = Me.GetResourceStream(strFile) 

Второй - немного громоздкий, но более гибкий:

Dim s = GetType(Foo).GetResourceStream(strFile) 

Несмотря на неуклюжесть, он позволяет типу (Foo) действовать как ресурс «локатор». Если ресурсы находятся в другой сборке, определите Foo в той же сборке для загрузки ресурсов оттуда. В идеале вы бы использовали реальный тип, который уже используется вашим приложением, но когда его нет, будет работать пустой класс Foo или ResLocator.

Вы также можете переопределить расширения просто как Friend Shared для использования в служебном классе.

Смежные вопросы