2013-02-16 7 views
5

.Netのジャストインタイムコンパイラによって生成されたx86アセンブリを見たいと思っています。私はhow to do this for "normal" codeを事前にコンパイルしていると知っていますが、実行時に動的に生成されたコード(これは表現木でやっています)のためにそれを行う方法はわかりません。式ツリーをコンパイルすることによって作成されたデリゲートの逆アセンブリを表示するにはどうすればよいですか?

私は実際に何を試してもわからない。たとえば、式ツリーをコンパイルすることによって作成されたデリゲートは、アドレスを指しますが、そのアドレスにあるものを表示するために何を使用するのかはわかりません。

答えて

2

私は、leppieの基本的な提案を使用して、その結果を外部アセンブリに出力しました。次に、リフレクターを使用してメソッドを抽出し、それを自分のコードに貼り付けました。それから私はペーストされた方法を実行し、何がされていたかチェックした。これは100%の正確さではないかもしれませんが、少なくとも示唆を与えます。ここで

は(結果のアセンブリが実行可能ファイルと同じディレクトリに終わる)メソッドを書くためのいくつかのコードです:

/// <summary> 
/// Writes an assembly, containing the given method, to the working directory. 
/// The assembly, type, and method are named based on the given hash name. 
/// </summary> 
public static void WriteMethodToAssembly<T>(Expression<T> method, string hashName) { 
    var assemblyName = new AssemblyName(hashName); 
    var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); 
    var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, assemblyName.Name + ".dll"); 
    var typeBuilder = moduleBuilder.DefineType(hashName, TypeAttributes.Public); 
    var methodBuilder = typeBuilder.DefineMethod("Run" + hashName, MethodAttributes.Public | MethodAttributes.Static); 
    method.CompileToMethod(methodBuilder); 

    typeBuilder.CreateType(); 
    assemblyBuilder.Save(hashName + ".dll"); 
} 

あなたがアセンブリを持っていたら、メソッドを抽出するために、反射鏡のようなツールを使用することができます。

+0

共有ありがとう:) – leppie

2

LambdaExpression.CompileToMethod(MethodBuilder)を使用してください。

次に、AssemblyBuilderをファイルに保存して、お気に入りのNET逆アセンブラで調べることができます。

+0

ジッタは、実行時に生成されたCILを、アセンブリからロードされたCILとまったく同じ方法で処理しますか?いずれかのケースで最適化を行うヒューリスティックなどがある場合はどうなりますか? –

+0

JITアセンブリまたはILを表示しますか?私の答えは前者には当てはまりません。どこからでもロードされたILは同じように扱われるべきです。 – leppie

+0

x86アセンブリコードを表示します。 –

関連する問題