31

式ツリーで Compile() を呼び出したときに生成された IL コードを表示できますか? 次の非常に単純な例を考えてみましょう。

class Program
{
    public int Value { get; set; }

    static void Main(string[] args)
    {
        var param = Expression.Parameter(typeof(Program));
        var con = Expression.Constant(5);
        var prop = Expression.Property(param, typeof(Program).GetProperty("Value"));
        var assign = Expression.Assign(prop, con);
        Action<Program> lambda = Expression.Lambda<Action<Program>>(assign, param).Compile();

        Program p = new Program();
        lambda(p);



        //p.Value = 5;
    }
}

これで、式ツリーは の最後の行にあることを実行しMainます。アプリケーションをコンパイルし、Reflector で開きます。p.Value = 5;割り当てを行うIL コードを確認できます。しかし、式ツリーは実行時に作成およびコンパイルされました。コンパイルの結果の IL コードを表示することはできますか?

4

3 に答える 3

29

はい!このツールを使用します:

https://github.com/drewnoakes/il-visualizer

ご想像のとおり、Compile を実装してデバッグするときに、これは非常に便利でした。

于 2011-01-21T22:48:21.083 に答える
24

DynamicAssembly を作成してから、DynamicModule、DynamicType、DynamicMethod を作成します。そのメソッドを public および static にして、ラムダのメソッド CompileTo() に渡します。アセンブリにフラグを付けて保存する場合。次に、Save() メソッドを呼び出してパスを渡します。ディスクに書き込まれます。リフレクターで開きます。

何かのようなもの:

var da = AppDomain.CurrentDomain.DefineDynamicAssembly(
    new AssemblyName("dyn"), // call it whatever you want
    AssemblyBuilderAccess.Save);

var dm = da.DefineDynamicModule("dyn_mod", "dyn.dll");
var dt = dm.DefineType("dyn_type");
var method = dt.DefineMethod(
    "Foo", 
    MethodAttributes.Public | MethodAttributes.Static);

lambda.CompileToMethod(method);
dt.CreateType();

da.Save("dyn.dll");
于 2011-01-21T22:56:29.317 に答える