これらのILは私がもっと見るものをコード化するので、それらを正しく解釈する方法を学びたいと思います。
C#コンパイラやその他のドキュメントが見つからなかったので、この一般的なドキュメントを学んだ後は、残りの部分はほとんど処理できると思います。
以下は私が知る必要があることを含むいくつかのサンプル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?
- ret?
- ldarg.0?
- ldstr?
- stfld?
- ldc.i4.s?
- .ctor-コンストラクター
ILを理解することは、特定のコンパイラがコードを生成し、特定の場合にどのように動作するかを明らかにするために重要です。
ただし、ILに関する例も含まれている優れたドキュメントは見つかりませんでした。C#3.0を使用したCLRは優れた本ですが、最終的にはILの本ではないため、ILについてすべてを説明しているわけではありません。
編集:
私はスペックを見つけました、そして彼らはこれらを伝えます: @usrに感謝します。
- nop(デバッグ用-操作なし)
- newobj-新しいオブジェクトを作成します
- stloc.0-スタックからローカル変数へのポップ値
- ldloc.0?-ローカル変数をスタックにロードします
- ret-メソッドから戻る
- ldarg.0-引数0をスタックにロードします。
- ldstr-リテラル文字列をロードします
- stfld-オブジェクトのフィールドに格納します
- ldc.i4.s-numをint32、短縮形としてスタックにプッシュします。
- .ctor-コンストラクター