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

5

我想查看由.Net的即时编译器生成的x86汇编代码。我知道如何对预先编译的“正常”代码执行此操作(链接1),但不知道如何对在运行时动态生成的代码执行此操作(这是使用表达式树完成的)。

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

2个回答

2

Jitter在运行时生成的CIL是否与从程序集加载的CIL完全相同?例如,如果有一些启发式规则在其中一个情况下进行更多优化,会怎样呢? - Craig Gidney
你想要查看JIT汇编还是IL代码?我的答案不适用于前者。从任何地方加载的IL代码应该被同等对待。 - leppie
1
我猜你可以在那种情况下使用调试器。不太确定怎么做 ;p - leppie

2
我最终采用了leppie的基本建议,将表达式输出到外部程序集中。然后,我使用反编译工具Reflector提取方法并将其粘贴到自己的代码中。接着运行粘贴的方法,并检查已经JIT编译的内容。这可能不是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");
}

一旦你有了这个程序集,就可以使用类似反编译器(reflector)的工具来提取方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接