1
il.Emit(OpCodes.Callvirt, _compactBinaryReader_ReadObject);

调用此函数,并在特殊情况下提供返回值“null”。

如果该值为空,我必须决定是否跳到标签上

在方法调用之后使用

il.Emit(OpCodes.Dup);
il.Emit(OpCodes.Brfalse_S, DECISION);

给我一个例外“JIT 编译器遇到内部限制。” 当我调用该函数时,代码会正确构建。

也尝试过 OpCodes.Brfalse。

我究竟做错了什么 ?

4

1 回答 1

1

找到了上述问题的原因,

应该理解的一件事是,当抛出“CLR:运行时代码生成验证”异常时,这意味着编写的代码格式不正确,并且当汇编程序对其进行评估时,它不接受编写的代码,问题通常是因为堆栈具有额外的值或更少。

“JIT 编译器遇到内部限制。” 当在运行时它期望我们提供其他东西的价值或当堆栈有其他东西时需要其他东西时抛出。

简而言之,后面的异常在运行时抛出,另一个在不满足 pre Run 条件时抛出。

无论如何,我找到了原因,我仍然有一些值存在于堆栈中,如果满足条件,我没有弹出,所以 POP OpCode 成功了,顺便说一下,Dup OpCode 从来没有解决过,它总是推送一个 null堆栈上的值,而不是复制最高值。

于 2011-07-30T13:05:50.303 回答