ILGenerator,决定null的返回值

时间:2011-07-23 06:41:17

标签: ilgenerator

il.Emit(OpCodes.Callvirt, _compactBinaryReader_ReadObject);

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

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

在方法调用之后使用

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

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

也试过OpCodes.Brfalse。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

找到上述问题的原因,

有一点应该理解,当一个例外 'CLR:验证运行时代码生成' 抛出它意味着编写的代码格式不正确,当汇编器评估它不接受编写的代码时,问题通常是因为堆栈具有额外的值或更少。

“JIT Compiler遇到内部限制。”在运行时它会抛出其他东西我们提供其他值的东西,或者当需要其他东西时堆栈还有别的东西。

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

无论如何我找到了原因,我有一些值仍然存在于堆栈上,如果条件被满足我没有弹出,所以POP OpCode做了这个伎俩,顺便说一句,Dup OpCode从来没有用过,它总是在堆栈上推送空值而不是复制最高值。