C# 获取方法的mem地址';通过assembly.load加载其程序集的实体

C# 获取方法的mem地址';通过assembly.load加载其程序集的实体,c#,.net,system.reflection,mono.cecil,C#,.net,System.reflection,Mono.cecil,我已使用assembly.load()将程序集B加载到程序集A的appdomain中 B有一个名为“X”的方法,我需要检索它的内存地址/指针 我知道在assembly.load()之后,B作为单个连续内存数据映射到内存中。我可以使用GetHInstance(模块)到达此位置。使用RVA偏移量到达B的代码段将不起作用,因为B是使用原始偏移量映射的 如何从内存中检索X的内存地址?这项工作的最终目标是什么?是否需要传递到非托管代码的函数指针?因为,如果是这样,那就行不通了——RVA可能只指向IL代码,

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

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

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


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

这项工作的最终目标是什么?是否需要传递到非托管代码的函数指针?因为,如果是这样,那就行不通了——RVA可能只指向IL代码,而不是进程无法运行的本机代码

在本演示中,我将假设该方法匹配一个动作签名(无参数并返回一个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,以及更改绑定标志)。如果有适当的权限,您还可以通过此机制访问私有方法。

我没有获得该方法的元数据令牌或方法名称。仅显示元数据(.text)部分开始处的虚拟偏移量。我需要用给定的RVA检索IL字节内容。但是,assembly.load()使用原始文件偏移量加载.NET程序集。我需要确保我的代码对虚拟地址和原始地址都有效,因为程序集可以动态加载到父级的appdomain中,或者作为独立程序独立启动。可执行。很抱歉,罗恩,但这是我听说过的最随意的要求之一。更重要的是,这是一个实现细节。即使我们能够可靠地向您提供这些信息,它也会在.NET的任何版本、加载器等中发生变化。您究竟为什么需要这一特定信息?我认为您需要提供更多关于上下文的详细信息,以及如果您想得到任何有用的响应,您在这里尝试实现的目标,特别是因为你问题的各个部分(比如“B是使用[a]原始偏移量映射的”)似乎没有任何意义。