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()
//ejecuto el método helloW
{
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)
{
//obtiene el dominio de la aplicación actual esto es necesario
helloW.Invoke(o,null);
}
Else
{
Console.WriteLine(“No se recibió el methodInfo”);
}
}
Else
{
Console.WriteLine(“No se puede acceder al type”);
}
}
Public CodeGenerator()
{
//cuando se construye código
//crea un nuevo ensamblado para nuestros métodos
currentDomain = AppDomain.CurrentDomain;
//crea un nuevo modulo en este ensamblado
assembleName = new AssemblyName();
assembleName. Name= “Hash”;
assemBuilder = currentDomain.DefineDynamicAssembly(assemName,AssemblyBuilderAccess.Run);
//crea un Nuevo tipo en el modulo
moduleBuild =assemBuilder.defineDynamicModule(“HackModule”);
typeBuilder = moduleBuilder.DefineType(“HackClass”,TypeAttributes.Public);
//ahora podemos agregar el método HelloW a la clase recién creada //
/*Ahora pod3mos generar algo de lenguaje intermedio de Microsoft que simplemente escriba una línea de texto en la consola.*/
MethodBuilder = typeBuilder.DefineMethod(“HelloW”,MethodAttributes.Public,null,null);
//crea un tipo
msilG.= methodBuilder.GetILGenerator();
msilG.EmitWriteLine(“Hello From me”);
msilG.Emit(OpCodes.Ret);
t= typeBuilder.CreateType();
}
Public Type T
{
Get
{
Return thist
}
}
}
}
No hay comentarios:
Publicar un comentario