IL程序无效,无法理解原因

时间:2012-04-27 08:57:14

标签: c# reflection.emit

我发了一些IL,这是我的代码:

mgen.Emit(OpCodes.Ldc_I4,0);
mgen.Emit(OpCodes.Newarr, typeof(object));
mgen.Emit(OpCodes.Stloc_1); // THIS SHOULD                       


mgen.Emit(OpCodes.Ldloc_1); // MATCH THIS ONE
mgen.Emit(OpCodes.Callvirt, typeof(IInternalFactory).GetMethod("Create"));
mgen.Emit(OpCodes.Castclass, method.ReturnType);
mgen.Emit(OpCodes.Ret);

这是一项正在进行中的工作,我已经创建了一个数组,现在我正准备用它做一些事情,所以我决定存储它(Stloc_1)然后将它推回到堆栈(Ldloc_1)中很快我做了这些指令,IL被发出信号无效,但如果我理解正确,这些指令应该不加修改。如果没有这两条指令,IL就能完美运行。所以我无法理解为什么后续推送的pop不起作用。

1 个答案:

答案 0 :(得分:5)

在将值存储在本地之前,必须使用ILGenerator.DeclareLocal方法声明本地。引用不存在的本地会导致JIT编译器声明程序无效。