3

我正在发出一些 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 可以完美运行。所以我无法理解为什么带有后续推送的弹出不起作用。

4

1 回答 1

5

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

于 2012-04-27T09:07:09.570 回答