.NET: получить ресурсы по отражению - PullRequest
3 голосов
/ 05 сентября 2010

Как мне динамически получить все ресурсы из моей текущей сборки? Я пробовал два метода, GetManifestResourceNames и GetResourceSet, но безуспешно. Я доволен решениями в VB.net или C #.

Первый метод

Этот первый метод возвращает только массив длины 1 с этим значением «MyNameSpace.Resources.resource». Проблема в том, что в этом файле более 1 ресурса.

Dim ca As Assembly = Assembly.GetExecutingAssembly
Dim rn() As String = CurrentAssembly.GetManifestResourceNames()

Второй метод

Dim ca As Assembly = Assembly.GetExecutingAssembly
Dim crm As New ResourceManager("", ca)
''//Dim CurrentResourceManager As New ResourceManager(_
         "MyNamespace.Resources.resources", CurrentAssembly)
''//Dim CurrentResourceManager As New ResourceManager( _
         "My.Resources", CurrentAssembly)
Dim rs As ResourceSet = CurrentResourceManager.GetResourceSet(CultureInfo.CurrentCulture, True, True)
Dim rs As ResourceSet = crm.GetResourceSet( _
              CultureInfo.CurrentCulture, True, True)

Исключение MissingManifestResourceException не обработано

Не удалось найти ресурсы подходит для указанной культуры или нейтральная культура. Удостовериться «.resources» был правильно вставлен или ссылка на сборку "MyProgram" во время компиляции, или что все необходимые спутниковые сборки загружаемый и полностью подписанный. загружаемый и полностью подписанный.

Решение (согласно Пассанту Ганса)

Скопируйте пространство имен из Resources.Designer.vb

<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)>  _
        Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
            Get
                If Object.ReferenceEquals(resourceMan, Nothing) Then
                    Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("MyNamespace.Resources", GetType(Resources).Assembly)
                    resourceMan = temp
                End If
                Return resourceMan
            End Get
        End Property

и поместите его в код

Dim CurrentResourceManager As New ResourceManager( _
         "MyNamespace.Resources", CurrentAssembly)
Dim rs As ResourceSet = CurrentResourceManager.GetResourceSet( _
         CultureInfo.CurrentCulture, True, True)

1 Ответ

3 голосов
/ 05 сентября 2010

Да, в имеется более 1 ресурса * MyNameSpace.Resources.resource .Какое имя вы должны передать ResourceManager, пустая строка работать не будет.

Чтобы увидеть, какой код вам нужно написать, запустите приложение Windows Forms и добавьте пару ресурсов вПроект + Свойства, вкладка Ресурсы.В обозревателе решений щелкните значок «Показать все файлы».Откройте узел «Мой проект», откройте узел Resources.resx и дважды щелкните файл Resources.Designer.vb.Обратите внимание на код свойства ResourceManager.

...