Как получить String Resources из файла dll? - PullRequest
0 голосов
/ 02 сентября 2011

В VS 2010, .Net 4.0Я пытаюсь получить имена всех строковых ресурсов в данной DLLКонечная цель, из набора файлов, - получить все ресурсы, проверить, какие из них являются строками, и проверить имена, чтобы увидеть, есть ли у них ключевые слова, которые я ищу.Главное: у меня есть только файл dll, больше ничего.Допустим, мое имя файла

    Dim myDllFullFileName as string = "C:\Bob.dll"

Сначала, я думаю, я должен получить Reflection:

    Dim myAssembly As New Reflection.Assembly 
    myAssembly=Reflection.Assembly.LoadFrom(myDllFullFileName)

Затем начинаются проблемы.Если бы я просто искал строковые ресурсы в моем текущем проекте, я мог бы сделать это:

   Dim myResourceSet As Resources.ResourceSet 
   myResourceSet = My.Resources.ResourceManager.GetResourceSet(Globalization.CultureInfo.CurrentCulture, True, True)
   For Each Dict As DictionaryEntry In myResourceSet.OfType(Of Object)()
            If TypeOf (Dict.Value) Is String Then
                If Dict.Key.ToString.Contains("myOwnKeyHere") Then
                    'work with dict.value'
                End If
            End If
    Next

Это будет хорошо работать для моего текущего проекта.И результаты именно то, что я ищу.Моя проблема в том, что я хочу сделать это с файлами DLL.Я думаю, что я должен быть в состоянии построить ResourSet из моей сборки.Для этого мне понадобится ResourceManager.Чтобы построить новый ResourceManager из myAssembly, я, вероятно, должен использовать этот метод:

Public Sub New(baseName As String, assembly As System.Reflection.Assembly)

И вот где я потерялся: мне не удается получить baseName из используемого мной dll-файла.Я также пытаюсь с

 myAssembly.GetManifestResourceNames()

Но это возвращает пустой массивЕсли у кого-то есть идея, я был бы очень признателен.

Спасибо.

1 Ответ

1 голос
/ 22 сентября 2011

ОК, вот один ответ: Я хочу получить имя и значение всей строки ресурса, которая находится в файле .dll или .resx или .exe.

    Dim myDllFullFileName As String = "C:\Bob.dll"
    'it will also work for .resx and .exe files'
    Dim myAssembly As Reflection.Assembly
    myAssembly = Reflection.Assembly.LoadFile(myDllFullFileName)
    Dim myBaseNames(-1) As String
    myBaseNames = myAssembly.GetManifestResourceNames
    Dim myResourcesBaseName As String = ""
    For i As Integer = 0 To myBaseNames.Length - 1
        If myBaseNames(i).Contains(".Resources.") Then
            myResourcesBaseName = myBaseNames(i)
            'in the case of a .exe file, you will get more than one file'
            'Example with an .exe file from a Windows Application having one form:'
            'WindowsApplication1.Form1.resources'
            'WindowsApplication1.Resources.resources'
            'you want the one containing ".Resources."'
        End If
    Next
    myResourcesBaseName = myResourcesBaseName.Substring(0, myResourcesBaseName.LastIndexOf("."))
    'then you cut the last part and keep "WindowsApplication1.Resources"'

    Dim myManager As System.Resources.ResourceManager
    myManager = New System.Resources.ResourceManager(myResourcesBaseName, myAssembly)

    Dim myResourceSet As Resources.ResourceSet = Nothing
    myResourceSet = myManager.GetResourceSet(Globalization.CultureInfo.CurrentCulture, True, True) 'the second true (tryparent, is vital)'
    Dim myResourceNames(-1) As String
    Dim myResourceValues(-1) As String
    If myResourceSet IsNot Nothing Then
        myResourceNames = GetStringRessources(myResourceSet) 'see below for this routine'
        ReDim myResourceValues(myResourceNames.Length - 1)
        For i As Integer = 0 To myResourceNames.Length - 1
            myResourceValues(i) = myResourceSet.GetString(myResourceNames(i))
        Next
    End If

Вот процедура GetRessources:

 Public Function GetStringRessources(valResourceSet As ResourceSet) As String()
    Dim myList(-1) As String
    For Each Dict As DictionaryEntry In valResourceSet.OfType(Of Object)()
        If TypeOf (Dict.Value) Is String Then
            ReDim Preserve myList(myList.Length)
            myList(myList.Length - 1) = Dict.Key.ToString
        End If
    Next
    Return myList
End Function

Это позволяет мне хранить имя и значение всех строк ресурсов.

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

...