C# MSIL代码的研究
我现在正在使用IL代码,将来需要自己编写。由于误解,我有些担心。下面是C语言中的一个简单方法# 这是它的IL代码C# MSIL代码的研究,c#,.net,cil,C#,.net,Cil,我现在正在使用IL代码,将来需要自己编写。由于误解,我有些担心。下面是C语言中的一个简单方法# 这是它的IL代码 .method public hidebysig static string Method1(int32 id) cil managed { // .maxstack 1 .locals init ([0] string CS$1$0000) IL_0000: nop // Why? IL_00
.method public hidebysig static string
Method1(int32 id) cil managed
{
//
.maxstack 1
.locals init ([0] string CS$1$0000)
IL_0000: nop // Why?
IL_0001: ldarg.0
IL_0002: call string MyNamespace.MyClass::Method2(int32)
IL_0007: stloc.0 // storing a return value of MyClass::Method2 to local variable.
IL_0008: br.s IL_000a // Why?
IL_000a: ldloc.0 // Does it really require and why?
IL_000b: ret
} // end of method MyClass::Method1
由于某种原因,CIL中的每个方法都有nop
操作。为什么会有呢?
在我的例子中,是否有必要使用
br.s IL_000a
,如果没有它,它会工作吗?NOP允许您调试(设置断点),如果您在发布模式下编译,您将在代码中看到较少的NOP
如果您在发布/优化模式下编译相同的代码,IL应该看起来更理智:
.method public hidebysig static string Method1(int32 id) cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: call string MyNamespace.MyClass::Method2(int32)
L_0006: ret
}
“我自己写”,你要写IL吗?我已经在peer的回复上发布了IL应该是什么样的编辑我在发布版本中编辑了它-希望你不介意。你涵盖了关键点,所以第二个答案似乎是多余的。马克,谢谢你,现在更清楚了。然而,为什么.maxstack等于8?还有一件事:我不必使用L_00XX:指令,是吗?
.method public hidebysig static string Method1(int32 id) cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: call string MyNamespace.MyClass::Method2(int32)
L_0006: ret
}