获取Method的正文的mem地址,该正文的程序集通过Assembly.load加载

时间:2012-12-05 02:23:06

标签: c# .net system.reflection mono.cecil

我已使用Assembly.load()将程序集B加载到程序集A的appdomain中。

B有一个名为“X”的方法,我需要检索它的内存地址/指针。

我知道B在assembly.load()之后作为单个连续的内存数据映射到内存中。我可以使用GetHInstance(模块)到达此位置。通过使用RVA偏移量到达B的代码段将无法工作,因为B使用原始偏移量进行映射。

如何从A中检索X的内存地址?

1 个答案:

答案 0 :(得分:0)

这最终目标是什么?你需要一个函数指针来传递给非托管代码吗?因为,如果是这样,那就不行了--RVA可能只会指向IL代码,而不是本机代码,而这个代码无法运行。

出于本演示的目的,我将假设该方法匹配Action签名(无参数并返回void类型),是静态的,并且在类FullyQualified.TypeName上称为SomeMethod。给定本地范围内的程序集引用“asm”:

Type t = asm.GetType("FullyQualified.TypeName");
MethodInfo method = t.GetMethod("SomeMethod", BindingFlags.Public | BindingFlags.Static);

此时,如果您真的想要IL中的方法体,可以调用:

MethodBody body = method.GetMethodBody();

或者,如果你想在本机代码中使用它,你可以传递给本机代码,那么你可以这样做:

Action action = (Action)method.CreateDelegate(typeof(Action));
IntPtr ptr = Marshal.GetFunctionPointerForDelegate(action);

如果您正在查看实例方法,还需要执行其他操作(例如,您需要将实例作为第二个参数传递给MethodInfo.CreateDelegate,以及更改绑定标志) 。如果有适当的权限,您还可以通过此机制访问私有方法。