質問

ilgeneratorを使用してEXEファイルを作成するための関数を作成しました。私が欲しいのは、ILDASMやReflectorなどの外部ツールを使用して生成されたIL言語をユーザーに表示することです。

私のプログラムの実行中に、各オペコードをilgeneratorに追加したため、このオプコードのそれぞれをオプコード表現のある文字列を使用してリストに保存できますが、ILコードを直接取得したいと思います。それはできますか?

重要: :モノ2.6を使用しています。

役に立ちましたか?

解決 2

として ハンス・パサントsvick 答えはMono.cecilです。どれどれ:

using Mono.Cecil;
using Mono.Cecil.Cil;

[...]


public void Print( ) {
    AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly( this.module_name );

    int i = 0, j = 0;
    foreach ( TypeDefinition t in assembly.MainModule.Types ) {
        if ( t.Name  == "FooClass" ) {
            j = i;
        }
        i++;
    }

    TypeDefinition type = assembly.MainModule.Types[ j ];

    i = j = 0;
    foreach ( MethodDefinition md in type.Methods ) {
        if ( md.Name == "BarMethod" ) {
            j = i;
        }
        i++;
    }

    MethodDefinition foundMethod = type.Methods[ j ];

    foreach( Instruction instr in foundMethod.Body.Instructions ) {
        System.Console.WriteLine( "{0} {1} {2}", instr.Offset, instr.OpCode, instr.Operand );
    }
}

確かにそれはより効率的に行うことができますが、それは私の問題を解決します。

他のヒント

あなたが持っている場合 MethodBuilder, 、使用できるはずです builder.GetMethodBody().GetILAsByteArray() ilをaとして取得します byte[]. 。しかし、それを意味するためには、どういうわけかそれを解析する必要があります。

したがって、より良い選択はおそらく使用されています モノセシル, 、読みやすい形式でアセンブリのILコードを提供できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top