该方法MethodBody.GetILAsByteArray();以字节表示形式返回 IL 代码,这一点很清楚。但是,我在这个方法的操作描述中没有找到细节MSDN:它是返回我描述的“逐字”指令,还是这个函数完全返回将要执行的指令?
让我解释:
- 在调试模式下,编译器不会以任何方式优化代码,因此
可执行指令与
程序员自己描述的相同。 - 在发布模式下,编译器内联、弃用并通常
更改许多内容,因此最终的可执行指令可能
与最初描述的内容大不相同。
它是否会以任何方式影响GetILAsByteArray()编译模式,或者此方法是否总是返回“逐字”方法语句?
答案是肯定的。这在实践中很容易验证。让我们写一个测试方法:
接下来,编写以下代码以从其 MSIL 代码中提取第一个操作数并显示操作的名称:
结果:
调试-
0x0000: nop发布-
0x0003: ldarg.1这是因为在调试构建中,每个方法的开头都插入了一个空语句以方便调试(这样您可以在方法的最开始放置断点,而在发布构建中您只能在第一行)。所以编译模式确实会影响方法的IL代码。