如何查看通过编译表达式树创建的委托的反汇编?

Cra*_*ney 5 .net c# jit expression-trees disassembly

我想看看.Net的即时编译器生成的x86程序集.我知道如何为"正常"代码执行此操作,提前编译,但不知道如何在运行时动态生成的代码(我正在使用表达式树).

我甚至不确定要尝试什么.例如,通过编译表达式树创建的委托指向一个地址,但我不知道该用什么来查看该地址的内容.

Cra*_*ney 2

我最终使用了 leppie 的基本建议,将表达式输出到外部程序集。然后,我使用 Reflector 提取该方法并将其粘贴到我自己的代码中。然后我运行粘贴的方法,并检查已粘贴的内容。这可能不是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");
}
Run Code Online (Sandbox Code Playgroud)

获得程序集后,您可以使用反射器等工具来提取方法。