我已使用Assembly.load()将程序集B加载到程序集A的appdomain中。
B有一个名为“X”的方法,我需要检索它的内存地址/指针。
我知道B在assembly.load()之后作为单个连续的内存数据映射到内存中。我可以使用GetHInstance(模块)到达此位置。通过使用RVA偏移量到达B的代码段将无法工作,因为B使用原始偏移量进行映射。
如何从A中检索X的内存地址?
答案 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,以及更改绑定标志) 。如果有适当的权限,您还可以通过此机制访问私有方法。