0

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

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

我知道 B 在 assembly.load() 之后作为单个连续内存数据映射到内存中。我可以使用 GetHInstance(module) 到达这个位置。通过使用 RVA 偏移量来到达 B 的代码段将不起作用,因为 B 是使用原始偏移量映射的。

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

4

1 回答 1

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,以及更改绑定标志)。给定适当的权限,您还可以通过此机制访问私有方法。

于 2012-12-05T04:38:41.907 回答