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

本文关键字:创建 反汇编 表达式 何查看 编译 | 更新日期: 2023-09-27 17:59:32

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

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

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

使用LambdaExpression.CompileToMethod(MethodBuilder)

然后,您可以将AssemblyBuilder保存到一个文件中,该文件可以在您喜欢的.NET反汇编程序中进行检查。

我最终使用了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");
}

一旦有了部件,就可以使用类似反射器的工具来提取方法。