IL中的'if'阻止

时间:2010-04-27 05:37:01

标签: .net il

我想我可能会遗漏一些重要的东西,但我似乎无法弄清楚如何使用动态方法在IL中构造条件语句。我之前只是轻轻地涉足它,但我现在需要扩展一些代码。

是否有一些我没有找到的文档(除了CLI文档),或者有人有一些示例代码?那太棒了。

干杯,

2 个答案:

答案 0 :(得分:4)

根据您的具体代码,各种分支说明都是您的朋友。

这是

if(memory[pointer] > 0) goto IL_0002;
IL中的

IL_001f:  ldsfld     uint8[] BFHelloWorldCSharp.Program::memory
IL_0024:  ldsfld     int16 BFHelloWorldCSharp.Program::pointer
IL_0029:  ldelem.u1
IL_002a:  ldc.i4.0
IL_002b:  bgt      IL_0002

您基本上将要比较的值推送到堆栈,然后调用bgt跳转到您需要的位置。

您可以查看OpCodes Class以快速了解IL命令,例如brtrue / brfalse或beq。

我还建议在C#中编写if命令,编译它,并使用ILDASM或Reflector查看生成的IL。

答案 1 :(得分:1)

这是怎么回事:

定义标签,例如:

var skipProperty = il.DefineLabel();

致电你的条件:

il.Emit(OpCodes.Brtrue, skipProperty);

在您希望跳转到的位置(例如if的结尾):

il.MarkLabel(skipProperty);

所以你创建了一个标签(你需要先做它以便引用存在,你稍后再调用'mark'将标签放在你想要的代码中的实际位置)。 OpCodes.Brtrue只是link text文章中列出的众多条件操作之一(感谢Michael