2016-06-21 7 views
0

ILコードのこのシンボル(IL_0000など)とは何ですか?これは本当のメモリヒープアドレスですか?ILコードのシンボルは何ですか?

IL_0000: nop 
    IL_0001: ldstr  "here is something" 
    IL_0006: call  void [mscorlib]System.Console::WriteLine(string) 
    IL_000b: nop 
    IL_000c: ldc.i4.s 18 
    IL_000e: newobj  instance void Proj.Stock::.ctor(int32) 
    IL_0013: stloc.0 
    IL_0014: ldstr  "another" 
    IL_0019: call  void [mscorlib]System.Console::WriteLine(string) 
    IL_001e: nop 
    IL_001f: ldstr  "and even more" 
    IL_0024: call  void [mscorlib]System.Console::WriteLine(string) 
    IL_0029: nop 
    IL_002a: ret 

答えて

3

IL_0000:はコードラベルです。これは本当に単なる識別子なので、ジャンプ位置をバイト数ではなく名前で簡単に参照できます。

共通言語インフラストラクチャ(CLI)の標準ドキュメントを参照してください。 ECMA-335セクションII.5.4

II.5.4ラベルと

ラベルは、プログラミング便宜として提供されるラベルのL ISTS。それらはメタデータに符号化された の番号を表します。 ラベルで表される値は、現行の メソッドの先頭からのバイト単位のオフセットですが、論理メタデータ構造またはCILストリームの が発生する によって正確なエンコーディングが異なります。

...

+1

また、(数字は相対アドレスであるため)あなたのすべての命令の大きさを示すのは興味深い副作用があります。 –

+0

真... ILDASMを使用していれば...それは必須条件ではありません。 –

+0

@FrédéricHamidi - ラベル 'IL_0001'では、文字列' ldstr'は 'here is something'です。次のラベルは 'IL_0006'です。しかし、ここにあるものは17文字で、Unicode(1文字あたり2バイト)として格納されています。これは34バイトです。次のラベルは 'IL_0023'(35進数で35)なのではないでしょうか? – Icemanind

関連する問題