在生成的IL代码中,缺少一些行。线之间的任务是什么?

时间:2016-12-27 17:17:43

标签: c# .net cil

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       9 (0x9)
  .maxstack  1
  .locals init ([0] class ConstReadOnly.second p)
  IL_0000:  nop
  IL_0001:  ldc.i4.5
  IL_0002:  newobj     instance void ConstReadOnly.second::.ctor(int32)
  IL_0007:  stloc.0
  IL_0008:  ret
} // end of method Program::Main

此处IL_0002后跟IL_0007 任何人都可以告诉我这里发生的实际情况吗?

2 个答案:

答案 0 :(得分:3)

这只是标签。中间没有代码。标签表示从函数开头的偏移量(以字节为单位)。

offset_0:  nop      //size 1 byte
offset_1:  ldc.i4.5 // size 1 byte
offset_2:  newobj instance void ConstReadOnly.second::.ctor(int32) // size 5 bytes
offset_7:  stloc.0 // size 1 byte 
offset_8:  ret

您可以轻松更改它们并重新编译。

答案 1 :(得分:1)

当我在指定ildasm选项时对代码运行/BYTES时,输出为:

.method private hidebysig static void  Main(string[] args) cil managed
// SIG: 00 01 01 1D 0E
{
  .entrypoint
  // Method begins at RVA 0x2048
  // Code size       9 (0x9)
  .maxstack  1
  .locals init (class ConstReadOnly.second V_0)
  IL_0000:  /* 00   |                  */ nop
  IL_0001:  /* 1B   |                  */ ldc.i4.5
  IL_0002:  /* 73   | (06)000003       */ newobj     instance void ConstReadOnly.second::.ctor(int32)
  IL_0007:  /* 0A   |                  */ stloc.0
  IL_0008:  /* 2A   |                  */ ret
} // end of method Program::Main

在这里,您可以看到用于在磁盘上将代码表示为注释的实际字节数。请注意,所有指令只使用一个字节,newobj指令除外,它是5个字节,与行标签中使用的数字完全对应。

那些标签在那里,任何跳转指令都可以显示它们跳转的位置。它们与您在C#中编写的代码行没有任何关系。