我想看看 .Net 的即时编译器生成的 x86 程序集。我知道如何为提前编译的“普通”代码执行此操作,但不知道如何为运行时动态生成的代码执行此操作(我正在使用表达式树)。
我什至不确定要尝试什么。例如,通过编译表达式树创建的委托指向一个地址,但我不知道用什么来查看该地址的内容。
我想看看 .Net 的即时编译器生成的 x86 程序集。我知道如何为提前编译的“普通”代码执行此操作,但不知道如何为运行时动态生成的代码执行此操作(我正在使用表达式树)。
我什至不确定要尝试什么。例如,通过编译表达式树创建的委托指向一个地址,但我不知道用什么来查看该地址的内容。
使用LambdaExpression.CompileToMethod(MethodBuilder)
.
然后,您可以将 AssemblyBuilder 保存到可以在您最喜欢的 .NET 反汇编程序中检查的文件中。
我最终使用了 leppie 的基本建议,将表达式输出到外部程序集。然后,我使用反射器提取方法并将其粘贴到我自己的代码中。然后我运行 paste 的方法,并检查了什么是 jitted。这可能不是 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");
}
组装完成后,您可以使用反射器之类的工具来提取方法。