由于这些 IL 编码了我所看到的更多内容,因此我喜欢学习如何正确解释它们。
我找不到像 C# Compiler 之类的文档或任何其他文档,所以我认为在学习了这些常见文档后,我几乎可以处理其余部分:
下面是一些示例 IL 代码,其中包含我需要知道的内容:
样品 1:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 15 (0xf)
.maxstack 1
.locals init ([0] class EnumReflection.DerivedClass derivedClass)
IL_0000: nop
IL_0001: newobj instance void EnumReflection.DerivedClass::.ctor()
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: callvirt instance void EnumReflection.DerivedClass::WriteOutput()
IL_000d: nop
IL_000e: ret
} // end of method Program::Main
样本 2:
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 38 (0x26)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldstr "Hello"
IL_0006: stfld string EnumReflection.DerivedClass::hello
IL_000b: ldarg.0
IL_000c: ldstr "World"
IL_0011: stfld string EnumReflection.DerivedClass::world
IL_0016: ldarg.0
IL_0017: ldc.i4.s 123
IL_0019: stfld int32 EnumReflection.DerivedClass::age
IL_001e: ldarg.0
IL_001f: call instance void EnumReflection.BaseClass::.ctor()
IL_0024: nop
IL_0025: ret
} // end of method DerivedClass::.ctor
自从我制作了这些代码以来,我就知道它们的作用:-) 但是我想了解有关相应 IL 代码的更多信息。
这些示例包含 IL 代码之类的,您能解释一下带问号的命令吗?还有这些命令代表什么?所以我们可以很容易地记住它们。
- nop(用于调试 - 无操作)
- newobj(似乎它正在堆中创建新对象)
- stloc.0 ?
- ldloc.0 ?
- 重?
- ldarg.0 ?
- ldstr ?
- stfld?
- ldc.i4.s ?
- .ctor - 构造函数
理解 IL 很重要,因为它揭示了特定编译器如何生成代码并在特定情况下采取行动。
但是,我找不到包含有关 IL 示例的好文档。CLR with C# 3.0 是一本好书,但最终它不是一本 IL 书,因此它没有解释有关 IL 的所有内容。
编辑:
我找到了规格,他们告诉了这些:感谢@usr。
- nop(用于调试 - 无操作)
- newobj - 创建一个新对象
- stloc.0 - 从堆栈弹出值到局部变量
- ldloc.0 ? - 将局部变量加载到堆栈上
- ret - 从方法返回
- ldarg.0 - 将参数 0 加载到堆栈上。
- ldstr - 加载文字字符串
- stfld - 存储到对象的字段中
- ldc.i4.s - 将 num 作为 int32 短格式推入堆栈。
- .ctor - 构造函数