我试图使用德尼布库wich作为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和,相反,它向我展示了许多构造函数(.ctor)和其他方法。
我想做的只是对我编译的源代码中包含的所有方法(私有化、公共等)执行一次迭代,而不管项目有哪些类,以及哪个类包含特定的方法,以获得它的指令。
发布于 2014-08-02 13:56:02
看起来你只是在程序集中四处游走,所以你得到的只是在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
MySettingsPropertyhttps://stackoverflow.com/questions/25094671
复制相似问题