首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IL中的“IL”块

IL中的“IL”块
EN

Stack Overflow用户
提问于 2010-04-27 13:37:01
回答 2查看 824关注 0票数 3

我想我可能遗漏了一些重要的东西,但我似乎不知道如何用动态方法在IL中构造条件语句。我以前只是稍微涉猎过,但现在我需要扩展一些代码。

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

干杯,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-27 13:45:13

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

这是

代码语言:javascript
复制
if(memory[pointer] > 0) goto IL_0002;

在IL中:

代码语言:javascript
复制
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。

票数 4
EN

Stack Overflow用户

发布于 2010-04-27 14:08:44

下面是它的运行方式:

定义标签,例如:

代码语言:javascript
复制
var skipProperty = il.DefineLabel();

给你的情况打电话:

代码语言:javascript
复制
il.Emit(OpCodes.Brtrue, skipProperty);

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

代码语言:javascript
复制
il.MarkLabel(skipProperty);

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2718966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档