Как использовать библиотеку dnlib, чтобы получить инструкции всех методов?

Я пытаюсь использовать библиотеку dnlib, которая является частью проекта de4dot, для загрузки сборки и получения инструкций IL, содержащихся в "теле" всех методов.

Я собрал ассемблер с этим источником VB.NET:

Public Class Main

    Public Sub testmethod(ByVal testparameter As String)
        MsgBox(testparameter)
    End Sub

    Public Class Test2

        Public Function testfunction(ByVal testparameter As String) As String
            Return testparameter
        End Function

    End Class

End Class

Я знаю, что компилятор многое меняет, но я думаю, что имена методов (в данном случае) не будут изменены, пожалуйста, исправьте меня, если я ошибаюсь.

Затем я пытаюсь получить эти методы с помощью этого кода:

Imports dnlib.DotNet
Imports dnlib.DotNet.Emit

Private Sub Test_Handler() Handles MyBase.Shown

    Dim asmResolver As New AssemblyResolver()
    Dim modCtx As New ModuleContext(asmResolver)

    ' All resolved assemblies will also get this same modCtx
    asmResolver.DefaultModuleContext = modCtx

    ' Enable the TypeDef cache for all assemblies that are loaded
    ' by the assembly resolver. Only enable it if all auto-loaded
    ' assemblies are read-only.
    asmResolver.EnableTypeDefCache = True

    Dim Assembly As ModuleDefMD = ModuleDefMD.Load("C:\WindowsApplication.exe")
    Assembly.Context = modCtx
    ' Use the previously created (and shared) context
    Assembly.Context.AssemblyResolver.AddToCache(Assembly)

    Dim Members As IEnumerable(Of MemberRef) = Assembly.GetMemberRefs

    For Each m As MemberRef In Members

        If m.IsMethodRef Then

            Dim Method As MethodDef = m.ResolveMethod

            If Method.HasBody Then

                Dim sb As New System.Text.StringBuilder
                With sb
                    .AppendLine(String.Format("Method Name: {0}", Method.FullName))
                    .AppendLine()
                    .AppendLine(String.Format("Method Signature: {0}", Method.Signature.ToString))
                    .AppendLine()
                    .AppendLine(String.Format("Method Instructions: {0}", Environment.NewLine &
                                              String.Join(Environment.NewLine, Method.Body.Instructions)))
                End With
                MessageBox.Show(sb.ToString)

            End If

        End If

    Next

End Sub

Проблема в том, что единственной документацией к этой библиотеке, которую я видел, является файл документации XML и несколько очень простых примеров на сайте dnlib, которые помогли мне написать приведенный выше код, но я не уверен, как их разрешить / получить методы, потому что я не делаю это правильно, код выше не разрешает какой-либо метод, который я скомпилировал (testmethod и testfunction), вместо этого он показывает мне много конструкторов (.ctor) и других методов.

Я хотел бы просто выполнить итерацию всех методов (приватных, общедоступных и т. Д.), Содержащихся в исходном коде, который я скомпилировал, независимо от количества классов, которые есть в проекте, и независимо от того, какой класс содержит конкретный метод., чтобы получить его инструкции.

1 ответ

Решение

Похоже, вы просто ковыряетесь в сборке, поэтому все, что вам нужно, - это материал, определенный в AssemblyInfo.vb, Что вы, вероятно, хотите сделать, это итерировать типы в сборке, а затем перейти к элементам или свойствам, определенным для того, который вы ищете.

Этот код должен указать вам правильное направление:

Dim modDef As ModuleDefMD = ModuleDefMD.Load("C:\Temp\ConsoleApplication1.exe")

For Each t As TypeDef In modDef.GetTypes
    'print the Type name
    Console.WriteLine(t.Name)

    ' stupid way to match a Type, but will work for demo purposes
    If t.FullName.StartsWith("ConsoleApplication1.Module1") Then

        For Each meth As MethodDef In t.Methods
            ' print the method name
            Console.WriteLine("     Method: {0}", meth.Name)
        Next

    End If
Next

Вывод выглядит следующим образом, обратите внимание, что ваши методы перечислены.

<Module>
MyApplication
MyComputer
MyProject
MyWebServices
ThreadSafeObjectProvider`1
InternalXmlHelper
RemoveNamespaceAttributesClosure
Module1
     Method: Main
     Method: testmethod
Test2
     Method: .ctor
     Method: testfunction
Resources
MySettings
MySettingsProperty
Другие вопросы по тегам