x86アセンブリが.Netのジャストインタイムコンパイラによって生成されるのを見たいです。事前にコンパイルされた「通常の」コードに対してこれを行う方法は知っていますが、実行時に動的に生成されるコード(式ツリーで行っている)に対してこれを行う方法がわかりません。
何をすればいいのかよくわかりません。たとえば、式ツリーをコンパイルして作成されたデリゲートはアドレスを指していますが、そのアドレスにあるものを表示するために何を使用すればよいかわかりません。
x86アセンブリが.Netのジャストインタイムコンパイラによって生成されるのを見たいです。事前にコンパイルされた「通常の」コードに対してこれを行う方法は知っていますが、実行時に動的に生成されるコード(式ツリーで行っている)に対してこれを行う方法がわかりません。
何をすればいいのかよくわかりません。たとえば、式ツリーをコンパイルして作成されたデリゲートはアドレスを指していますが、そのアドレスにあるものを表示するために何を使用すればよいかわかりません。
最終的に、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");
}
アセンブリを作成したら、リフレクターなどのツールを使用してメソッドを抽出できます。
を使用しLambdaExpression.CompileToMethod(MethodBuilder)
ます。
その後、AssemblyBuilder をファイルに保存して、お気に入りの .NET 逆アセンブラーで調べることができます。