我正在尝试使用作为de4dot项目一部分的dnlib库来加载程序集并获取包含在所有方法的“主体”中的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)和其他方法。
我想做的只是对我编译的源中包含的所有方法(私有、公共等)进行迭代,而不管项目有多少类,也不管哪个类包含特定方法, 得到它的指示。