我想我可能遗漏了一些重要的东西,但我似乎不知道如何用动态方法在IL中构造条件语句。我以前只是稍微涉猎过,但现在我需要扩展一些代码。
有没有一些我没有找到的文档(除了CLI文档),或者有人有一些示例代码?那就太棒了。
干杯,
发布于 2010-04-27 13:45:13
根据您的确切代码,不同的分支指令是您的朋友。
这是
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。
发布于 2010-04-27 14:08:44
下面是它的运行方式:
定义标签,例如:
var skipProperty = il.DefineLabel();给你的情况打电话:
il.Emit(OpCodes.Brtrue, skipProperty);在您希望它跳到的位置(例如if的末尾):
il.MarkLabel(skipProperty);所以你创建了一个标签(你需要先创建一个引用,然后调用'mark‘把标签放在你想要的代码中的实际位置)。OpCodes.Brtrue只是link text文章中列出的众多条件操作之一(感谢Michael
https://stackoverflow.com/questions/2718966
复制相似问题