Instanciación e invocación dinámica en mono/.net
En esta entrada muestro un ejemplo de lo fácil que es crear una instancia de clase dinámicamente en mono/.net y además ejecutar métodos.
Primero muestro un ensamblado (archivo.dll) que vamos a usar de prueba, el siguiente es entonces el archivo "TestAssembly.cs":
$ mcs -target:library TestAssembly.cs
lo cual generó un archivo: TestAssembly.dll
Ahora el código del ejemplo, el cual lo guardamos en el archivo "TestActivator.cs":
$ mcs TestActivator.cs
entonces la cosa queda así:
jaa@dino-thunder:/tmp/mono$ ls
TestActivator.exe TestAssembly.dll
y podemos ejecutar el ejemplo:
jaa@dino-thunder:/tmp/mono$ mono TestActivator.exe
Constructor de TestActivator.ClaseEjemplo
metodo ()
Constructor de TestAssemblyNs+TestClass
metodoTest(1,parametro de prueba)
jaa@dino-thunder:/tmp/mono$
Primero muestro un ensamblado (archivo.dll) que vamos a usar de prueba, el siguiente es entonces el archivo "TestAssembly.cs":
para compilarlo simplemente:
class TestAssemblyNs
{
public class TestClass
{
public TestClass ()
{
System.Console.WriteLine ("Constructor de {0}", this.GetType().FullName);
}
public void metodoTest (int param1, string param2)
{
System.Console.WriteLine ("metodoTest({0},{1})",param1, param2);
}
}
}
$ mcs -target:library TestAssembly.cs
lo cual generó un archivo: TestAssembly.dll
Ahora el código del ejemplo, el cual lo guardamos en el archivo "TestActivator.cs":
namespace TestActivatorpara compilarlo:
{
using System;
using System.Reflection;
class ClaseEjemplo
{
public ClaseEjemplo ()
{
System.Console.WriteLine("Constructor de {0}",this.GetType().FullName);
}
public void metodo ()
{
System.Console.WriteLine ("metodo ()");
}
}
class MainClass
{
public static void Main (string[] args)
{
ClaseEjemplo obj=null;
object noRegistrado=null;
// EJEMPLO 1
Type t = typeof (ClaseEjemplo);
// instancia el objeto
obj = (ClaseEjemplo)System.Activator.CreateInstance (t);
// llama el metodo
obj.metodo ();
// EJEMPLO 2: la clase esta en una dll externa. Invoca el método
// dinámicamente.
// carga el assembly (el archivo)
Assembly ass = Assembly.LoadFrom ("TestAssembly.dll");
// trae el tipo del ns.
Type ns = ass.GetType ("TestAssemblyNs");
// dentro del ns busca el tipo correspondiente a TestClass
Type ta =ns.GetNestedType("TestClass",BindingFlags.Public);
// instancia el objeto.
noRegistrado = System.Activator.CreateInstance (ta);
// obtiene la metada del método.
MethodInfo minf = noRegistrado.GetType ().GetMethod ("metodoTest");
// llama el metodo
object[] paramList= new object[] {1,"parametro de prueba"};
minf.Invoke (noRegistrado, paramList);
}
}
}
$ mcs TestActivator.cs
entonces la cosa queda así:
jaa@dino-thunder:/tmp/mono$ ls
TestActivator.exe TestAssembly.dll
y podemos ejecutar el ejemplo:
jaa@dino-thunder:/tmp/mono$ mono TestActivator.exe
Constructor de TestActivator.ClaseEjemplo
metodo ()
Constructor de TestAssemblyNs+TestClass
metodoTest(1,parametro de prueba)
jaa@dino-thunder:/tmp/mono$

0 comentarios:
Publicar un comentario en la entrada
Suscribirse a Enviar comentarios [Atom]
<< Página principal