lunes, 31 de diciembre de 2007

Reflection

CHenry [chenry@hha.sld.cu]

Continuando el articulo anterior otra de las características de reflection es la posibilidad de generar código en tiempo de ejecución algo realmente interesante ya que no solo nos permite obtener los metadatos de un ensamblado si no que también podemos ejecutar alguna secuencia de código antes durante o después de la llamada a algún método de un tipo en especifico de ese ensamblado pero ya basta de bla bla bla e aquí un ejemplo que habla por si solo.

Ejemplo Como generar código dinámicamente en tiempo de ejecución
Using system;
Using System.reflection;
Using system.reflection.Emit;

Namespace
{
  Class CodeGenerator
  {
     Type t;
     AppDomain currentDomaine;
     AssemblyName assemblyName;
     ModuleBuilder moduleBuilder;
     TypeBuilder typeBuilder;
     MethodBuilder methodBuilder;
     ILGenerator msilG;

     Public static void Main()
     {
        CodeGenerator codeGen = new CodeGenerator();
        Type t 0 codeGen.T;
        If(t!=null)
        {
           Object o = Activator.CreateInstance(t);
           MethodInfo helloW = t.GetMethod(“HelloW”);
           If(helloW!=null)
           {
//ejecuto el método helloW
              helloW.Invoke(o,null);
           }
           Else
           {
              Console.WriteLine(“No se recibió el methodInfo”);
           }
        }
        Else
        {
           Console.WriteLine(“No se puede acceder al type”);
        }
     }
     Public CodeGenerator()
     {
//obtiene el dominio de la aplicación actual esto es necesario
//cuando se construye código
        currentDomain = AppDomain.CurrentDomain;
//crea un nuevo ensamblado para nuestros métodos
        assembleName = new AssemblyName();
        assembleName. Name= “Hash”;
        assemBuilder = currentDomain.DefineDynamicAssembly(assemName,AssemblyBuilderAccess.Run);
//crea un nuevo modulo en este ensamblado
        moduleBuild =assemBuilder.defineDynamicModule(“HackModule”);
//crea un Nuevo tipo en el modulo
        typeBuilder = moduleBuilder.DefineType(“HackClass”,TypeAttributes.Public);

//ahora podemos agregar el método HelloW a la clase recién creada //
        MethodBuilder = typeBuilder.DefineMethod(“HelloW”,MethodAttributes.Public,null,null);
/*Ahora pod3mos generar algo de lenguaje intermedio de Microsoft que simplemente escriba una línea de texto en la consola.*/
        msilG.= methodBuilder.GetILGenerator();
        msilG.EmitWriteLine(“Hello From me”);
        msilG.Emit(OpCodes.Ret);
//crea un tipo
        t= typeBuilder.CreateType();
     }
     Public Type T
     {      
        Get
        {
           Return thist
        }
     }
  }
}



Artículos relacionados


No hay comentarios: