2011-01-21 23 views
28

式ツリーでCompile()を呼び出すと生成されるILコードを表示できますか?この非常に簡単な例を考え:今コンパイル済み式から生成された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の最後の行が言うことありません。アプリケーションをコンパイルし、リフレクターで開きます。あなたは割り当てを行うp.Value = 5;のILコードを見ることができます。しかし、表現ツリーは実行時に作成されコンパイルされました。結果のILコードをコンパイルから見ることは可能ですか?

+0

をしたいですか?あるいは、あなたが特に興味を持っている 'Expression'出力について何かありますか? –

+0

具体的な内容はありません。私は時々ILコードを見るのが好きです。しかし、式を使用すると、コンパイルされたアセンブリでILを取得しないメソッドを作成できます。その式ツリーの作成に使用されたILはそこにありますが、式ツリーのコンパイル自体の結果ではありません。それは理にかなっていますか?これは単なる好奇心であり、私が見ることのできる実際の実用的な目的には役立たない。 – Amy

+1

素晴らしい** LinqPad **ツールを試しましたか? http://www.linqpad.net/生成されたコードをMSILとして表示して、ほとんど何でもすばやく試すことができます。 – AFract

答えて

28

はい!このツールを使用してください:私はあなたが想像できると確信しているように私は、コンパイルを実行するとデバッグたとき

http://blogs.msdn.com/b/haibo_luo/archive/2006/11/16/take-two-il-visualizer.aspx

これは非常に有用でした。

+3

エリック、時間があれば、これを肉体的な答えにすることができますか?スタックオーバーフローでは、リンクのみの回答は推奨されません。 – casperOne

+0

コンパイルできないのは悪いですが、バイナリバージョンはありますか? –

+2

@casperOne:そうすることをお勧めします。私は追加するものはない。 –

21

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

何か:あなただけ(すなわち、プロパティを設定する)あなたは* *をやっている何のために*同等* ILを

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"); 
+0

'DefineMethod'メソッドから' MethodAttributes.Static'を削除することに興味がある人のために、いくつかの研究があります。 http://stackoverflow.com/a/3993023/903505 結論として、 'CompileToMethod'は静的方法 – Ariex

関連する問題