2016-12-27 36 views
4
.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
任何人都可以給我這裏發生的實際情況嗎?在生成的IL代碼中,缺少一些行。兩行之間的任務是什麼?

+0

@Wiktor Zychla但我的問題是這些inbetween行表演,我沒有任何線索。 –

回答

2

它只是標籤。中間沒有代碼。標籤表示以字節爲單位的起始偏移量。

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 

您可以輕鬆地更改它們並重新編譯。

+0

感謝@powel lukasik._你建議我如何在內存分配範圍內跟蹤visual studio中代碼行的執行情況。我們可以進行調試,但沒有提供關於內存分配的信息._ –

+0

@ murali.j這與您的原始問題有點無關。我認爲你不能這樣做。有一個R#插件顯示隱藏分配 - https://github.com/controlflow/resharper-heapview –

+0

lukasik是啊,它是無關的。但感謝您的信息。 –

0

當我在你的代碼運行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#中編寫的代碼行沒有任何關係。