我想我可能遗漏了一些重要的东西,但我似乎无法弄清楚如何使用动态方法在 IL 中构造条件语句。我以前只是轻轻地涉足它,但我现在需要扩展一些代码。
是否有一些我没有找到的文档(除了 CLI 文档),或者有人有一些示例代码?那太棒了。
干杯,
根据您的确切代码,各种分支指令是您的朋友。
这是
if(memory[pointer] > 0) goto IL_0002;
在伊利诺伊州:
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 类以快速了解 IL 命令,例如 brtrue/brfalse 或 beq。
我还建议用 C# 编写 if 命令,编译它,然后使用 ILDASM 或 Reflector 查看生成的 IL。
事情是这样的:
定义一个标签,例如:
var skipProperty = il.DefineLabel();
打电话给你的条件:
il.Emit(OpCodes.Brtrue, skipProperty);
在您希望它跳到的地方(例如 if 的结尾):
il.MarkLabel(skipProperty);
因此,您创建了一个标签(您需要先执行此操作以使引用存在,稍后您调用“标记”以将标签放置在您想要的代码中的实际位置)。OpCodes.Brtrue 只是链接文本文章中列出的众多条件操作之一(感谢 Michael