我想查看由.Net的即时编译器生成的x86汇编代码。我知道如何对预先编译的“正常”代码执行此操作(链接1),但不知道如何对在运行时动态生成的代码执行此操作(这是使用表达式树完成的)。
实际上,我甚至不确定该尝试什么。例如,通过编译表达式树创建的委托指向一个地址,但我不知道用什么来查看该地址中的内容。
我想查看由.Net的即时编译器生成的x86汇编代码。我知道如何对预先编译的“正常”代码执行此操作(链接1),但不知道如何对在运行时动态生成的代码执行此操作(这是使用表达式树完成的)。
实际上,我甚至不确定该尝试什么。例如,通过编译表达式树创建的委托指向一个地址,但我不知道用什么来查看该地址中的内容。
LambdaExpression.CompileToMethod(MethodBuilder)
方法。然后,您可以将AssemblyBuilder保存到文件中,并在您喜欢的.NET反汇编器中进行检查。/// <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)的工具来提取方法。