これらのILコードは私がもっと見るものをコードするので、正しく解釈する方法を学ぶのが好きです。CLRで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についてすべてを説明するわけではありません。
EDIT:
私はスペックを見つけたと、彼らはこれらの教え:おかげで@usrします。 (デバッグのために - 操作なし)
- NOP
- NEWOBJ - 新しいオブジェクト
- stloc.0作成 - ローカル変数にスタックからポップ値を
- ldloc.0? - スタックにローカル変数をロードする
- メソッドから戻る -
- ldarg.0 - 引数0をスタックにロードします。
- ldstr - リテラル文字列
- stfldをロード - INT32、ショートフォームとしてスタックにプッシュNUM - オブジェクト
- ldc.i4.sのフィールドに格納します。
- .ctor - コンストラクタ
:。。私はタイトルを変更し – Tarik
...私の質問を編集した私は。これは完全に有効な質問だと思います。 – usr
@usr:タイトル変更ありがとうございます今よく見える。 – Tarik