3

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

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

干杯,

4

2 回答 2

4

根据您的确切代码,各种分支指令是您的朋友。

这是

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。

于 2010-04-27T05:45:12.503 回答
1

事情是这样的:

定义一个标签,例如:

var skipProperty = il.DefineLabel();

打电话给你的条件:

il.Emit(OpCodes.Brtrue, skipProperty);

在您希望它跳到的地方(例如 if 的结尾):

il.MarkLabel(skipProperty);

因此,您创建了一个标签(您需要先执行此操作以使引用存在,稍后您调用“标记”以将标签放置在您想要的代码中的实际位置)。OpCodes.Brtrue 只是链接文本文章中列出的众多条件操作之一(感谢 Michael

于 2010-04-27T06:08:44.053 回答