Как использовать библиотеку 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