2011-06-14 19 views
5

He heredado el código que usa DynamicMethod para generar métodos en tiempo de ejecución. También necesito modificar algo del código que se está generando.Guardar un DynamicMethod en el disco

Puesto que soy un n00b en MSIL, me gustaría ser capaz de cargar el código generado en el reflector y asegurarse de que el código hace lo que yo deseo que lo hace;)

Solo, no puedo averiguar cómo serializar el "Ensamblaje de DynamicMethods hospedado anónimamente" en el disco. es posible? ¿Si es así, cómo?

Respuesta

2

Creo que si desea cargar el método en Reflector o dotPeek, debe crear un ensamblaje real. Para hacerlo, use MethodBuilder en lugar de DynamicMethod. La mayor parte del uso de ellos debería ser el mismo.

+0

Lo sentimos mantener esta abierta durante tanto tiempo. Quería esperar hasta que pudiera implementar esto antes de aceptar, ¡pero por supuesto estoy trabajando en otro proyecto ahora! Aún así, esta parece ser la única respuesta real, así que cuando vuelva a trabajar en esto, sabré qué hacer. –

6

Prueba de esto,

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"); 
Cuestiones relacionadas