Cra*_*ney 5 .net c# jit expression-trees disassembly
我想看看.Net的即时编译器生成的x86程序集.我知道如何为"正常"代码执行此操作,提前编译,但不知道如何在运行时动态生成的代码(我正在使用表达式树).
我甚至不确定要尝试什么.例如,通过编译表达式树创建的委托指向一个地址,但我不知道该用什么来查看该地址的内容.
我最终使用了 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)
获得程序集后,您可以使用反射器等工具来提取方法。
| 归档时间: |
|
| 查看次数: |
266 次 |
| 最近记录: |