我想我可能会遗漏一些重要的东西,但我似乎无法弄清楚如何使用动态方法在IL中构造条件语句。我之前只是轻轻地涉足它,但我现在需要扩展一些代码。
是否有一些我没有找到的文档(除了CLI文档),或者有人有一些示例代码?那太棒了。
干杯,
答案 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