C# 用Reflection.Emit调用私有构造函数?

C# 用Reflection.Emit调用私有构造函数?,c#,cil,C#,Cil,我试图发出以下IL: LocalBuilder pointer = il.DeclareLocal(typeof(IntPtr)); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Stloc, pointer); il.Emit(OpCodes.Ldloca, pointer); il.Emit(OpCodes.Call, typeof(IntPtr).GetMethod("ToPointer")); il.Emit(OpCodes.Ret); 与我绑定的

我试图发出以下IL:

LocalBuilder pointer = il.DeclareLocal(typeof(IntPtr));
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Stloc, pointer);
il.Emit(OpCodes.Ldloca, pointer);
il.Emit(OpCodes.Call, typeof(IntPtr).GetMethod("ToPointer"));
il.Emit(OpCodes.Ret);
与我绑定的代理具有签名

void* TestDelegate(IntPtr ptr)
它抛出异常

这一行动可能会破坏该地区的稳定 运行时

有人知道怎么了吗

编辑:
好的,我现在让IL工作了。其全部目标是能够调用私有构造函数。私有构造函数接受一个指针,因此我不能使用普通反射。现在。。当我调用它时,我得到一个异常

试图通过方法 存取方法 失败了


显然,它在执行安全检查——但根据经验,我知道反射通常能够执行这样的私有操作,所以希望有一种方法可以禁用该检查?

通常arg-0是
这个
指针,而不是参数列表中的
IntPtr


编辑:要回答新问题,需要使用另一个
DynamicMethod
构造函数。例如,被描述为“逻辑上与类型关联。此关联使其能够访问该类型的私有成员。”

而且,我不知道动态方法如何处理实例/静态方法,但我相信动态方法是静态方法,因此没有This指针。我意识到我没有说这是一种动态方法-对此很抱歉。@Jakob:显示创建
DynamicMethod
的代码,我认为您正在使用的构造函数,以及您正在传递的参数类型列表,可能对弄清楚这一点很重要。另外,您可以使用,除非你想复制参数。@Ben:我第一次使用了Ldarga,但当它不起作用时就把它关掉了(我几乎是从编译器输出的想要的代码中复制/粘贴的)。代码如下:你的IL看起来不错。尝试将其写入磁盘上的程序集(通过
AssemblyBuilder
);peverify会告诉你怎么了很奇怪。如果我使用AssemblyBuilder并生成所有这些,那么该方法可以很好地工作。如果我使用DynamicMethod,它会抛出该异常,尽管这些方法具有完全相同的IL。嗯……好吧,我现在让IL工作了。我用一个新问题编辑了我的帖子。编辑了我的答案,因为你编辑了问题。出于好奇,为了使IL验证,您必须更改什么?我使用了AssemblyBuilder、ModuleBuilder、TypeBuilder和MethodBuilder。当我这样做时,它工作得很好,但是使用DynamicMethod(尽管它是完全相同的IL指令),它可能“破坏运行时的稳定性”。