【发布时间】:2011-06-14 19:59:12
【问题描述】:
我继承了使用 DynamicMethod 在运行时生成方法的代码。我还需要修改一些正在生成的代码。
由于我是 MSIL 的一名 n00b,我希望能够将生成的代码加载到 Reflector 中,并确保代码能够按照我的意愿执行 ;)
只是,我不知道如何将“匿名托管的 DynamicMethods 程序集”序列化到磁盘。这可能吗?如果有,怎么做?
【问题讨论】:
标签: .net cil dynamicmethod
我继承了使用 DynamicMethod 在运行时生成方法的代码。我还需要修改一些正在生成的代码。
由于我是 MSIL 的一名 n00b,我希望能够将生成的代码加载到 Reflector 中,并确保代码能够按照我的意愿执行 ;)
只是,我不知道如何将“匿名托管的 DynamicMethods 程序集”序列化到磁盘。这可能吗?如果有,怎么做?
【问题讨论】:
标签: .net cil dynamicmethod
试试这个,
var assemblyName = new AssemblyName("SomeName");
var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave, @"c:");
var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, assemblyName.Name + ".dll");
TypeBuilder builder = moduleBuilder.DefineType("Test", TypeAttributes.Public);
var methodBuilder = builder.DefineMethod("DynamicCreate", MethodAttributes.Public, typeof(T), new[] { typeof(IDataRecord) });
/* this line is a replacement for your new DynamicMethod(....) line of code
/* GENERATE YOUR IL CODE HERE */
var t = builder.CreateType();
assemblyBuilder.Save(assemblyName.Name + ".dll");
【讨论】:
我认为如果要在 Reflector 或 dotPeek 中加载方法,则需要创建一个实际的程序集。为此,use MethodBuilder 而不是 DynamicMethod。它们的大部分用法应该是一样的。
【讨论】: