質問

式ツリーでコンパイル()を呼び出すときに生成された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 言う。アプリケーションをコンパイルしてから、リフレクターで開きます。のILコードを見ることができます p.Value = 5; それは割り当てを行います。しかし、式ツリーは実行時に作成され、編集されました。コンパイルから結果のILコードを表示することは可能ですか?

役に立ちましたか?

解決

はい!このツールを使用してください:

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

これは、コンパイルを実装してデバッグしていたときに非常に便利でした。想像できると確信しています。

他のヒント

DynamicAssemblyを作成し、次にDynamicModule、dynamictype、およびdynamicMethodを作成します。その方法を公開して静的にし、それをlambdaのメソッド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");
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top