c# - IL 无效程序,不明白为什么

标签 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 不起作用。

最佳答案

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

关于c# - IL 无效程序,不明白为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10347717/

相关文章:

c# - 使用 AssemblyBuilder 构建复杂类型

c# - IL Emit 调用泛型类型构造函数?

c# - 使用Br_S OpCode指向使用Reflection.Emit.Label的下一条指令

c# - 使用 sqlmetal 为 npgsql 生成 linq 类

c# - SignalR Redis 背板不工作 - 依赖性问题?

c# - 字节 + 字节 = 未知结果

c# - 从鼠标事件中获取 shift/ctrl/alt 状态?

c# - 使工具提示区域大于控件

c# - 反编译动态创建的类/类型

c# - 如何加载静态字段?