C#のコンパイル結果をニーモニックで確認(逆アセンブル)

<私の別ブログ 2014年03月17日 からの引っ越し記事です>

ILDASM.exeを使用すると、C#で作成したexeファイルを逆アセンブルしてニーモニックを確認できる。組込み系ソフト技術者としては、こういうのを見ると、なんだかワクワクします(笑)。

使用方法
Microsoft Windows SDKをインストール(自分の開発環境に対応するSDKを選択する必要あり?)。その中に含まれているILDASM.exeで、C#により作成したexeファイルを開く。
※パスは C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\ILDASM.exe など

使用例
たとえば、下記のサンプルソース。


        // 文字列のリスト
        List m_List = new List();

        // ボタン押下時処理
        private void button1_Click(object sender, EventArgs e)
        {
            // 文字列
            string input = "abc,def,ghi,jkl,mno,pqr,stu,vwx,yz";

            // カンマで分割
            string[] array = input.Split(',');

            // 分割した結果をリストに登録
            foreach (string elem in array)
            {
                m_List.Add(elem);
            }
        }

上記をビルドして作成したexeを、ILDASM.exeで解析すると、以下のようなニーモニックが見れる。


.method private hidebysig instance void  button1_Click(object sender,
                                                       class [mscorlib]System.EventArgs e) cil managed
{
  // Code size       67 (0x43)
  .maxstack  4
  .locals init ([0] string input,
           [1] string[] 'array',
           [2] string elem,
           [3] char[] CS$0$0000,
           [4] string[] CS$6$0001,
           [5] int32 CS$7$0002)
  IL_0000:  ldstr      "abc,def,ghi,jkl,mno,pqr,stu,vwx,yz"
  IL_0005:  stloc.0
  IL_0006:  ldloc.0
  IL_0007:  ldc.i4.1
  IL_0008:  newarr     [mscorlib]System.Char
  IL_000d:  stloc.3
  IL_000e:  ldloc.3
  IL_000f:  ldc.i4.0
  IL_0010:  ldc.i4.s   44
  IL_0012:  stelem.i2
  IL_0013:  ldloc.3
  IL_0014:  callvirt   instance string[] [mscorlib]System.String::Split(char[])
  IL_0019:  stloc.1
  IL_001a:  ldloc.1
  IL_001b:  stloc.s    CS$6$0001
  IL_001d:  ldc.i4.0
  IL_001e:  stloc.s    CS$7$0002
  IL_0020:  br.s       IL_003a
  IL_0022:  ldloc.s    CS$6$0001
  IL_0024:  ldloc.s    CS$7$0002
  IL_0026:  ldelem.ref
  IL_0027:  stloc.2
  IL_0028:  ldarg.0
  IL_0029:  ldfld      class [mscorlib]System.Collections.Generic.List`1 WindowsFormsApplication1.Form1::m_List
  IL_002e:  ldloc.2
  IL_002f:  callvirt   instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0)
  IL_0034:  ldloc.s    CS$7$0002
  IL_0036:  ldc.i4.1
  IL_0037:  add
  IL_0038:  stloc.s    CS$7$0002
  IL_003a:  ldloc.s    CS$7$0002
  IL_003c:  ldloc.s    CS$6$0001
  IL_003e:  ldlen
  IL_003f:  conv.i4
  IL_0040:  blt.s      IL_0022
  IL_0042:  ret
} // end of method Form1::button1_Click

ただし、MSILの命令セットの情報が見つからないので、今後調査を継続したい。

参考情報
ILDASM.exeはMicrosoft Windows SDKに含まれており、下記から取得可能です。
 Microsoft Windows SDK for Windows 7 and .NET Framework 4

タイトルとURLをコピーしました