sábado 23 de agosto de 2008

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":

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);
}
}
}
para compilarlo simplemente:

$ 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 TestActivator
{
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);
}
}
}
para compilarlo:
$ 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