Archive for June 24th, 2004

And when they said I’m telling lies you believed me

Thursday, June 24th, 2004

Jugando un poco con el sistema de plugins de mbloggy (para ir probando el wrapper) me diverti un rato jugando y leyendo lo que hace Reflections y Collections, muy bueno!.

Ahora cada plugin lo guardo como un simple .dll y lo uso en el wrapper. Por ejemplo, si queremos usar un método pues simplemente:

using System;
using System.Reflection;
using System.Collections;
 
class FooLoader 
{
	static void Main (string [] args)
	{
            Assembly a = Assembly.LoadFrom (args[0]);
            Type t= a.GetType("Foo");
 
            MethodInfo my_method = t.GetMethod("Add"); 
            object obj = Activator.CreateInstance(t); 
            object[] arguments = {3.1,3.2}; 
            my_method.Invoke(obj,arguments); 
	}
}

De esta manera le indicamos el assembly que debe cargar (dll, LoadFrom) que use el Type Foo (la clase Foo), luego le indicamos que cargue el método Add y lo guarde en my_method, creamos la instancia (para poder usarlo y manipularlo), los argumentos que recibe el método Foo y lo ejecutamos! y listo!.

Ahora, si nuestro método regresa un valor pues lo mejor va a ser guardarlo, podemos usar

object myVal = my_method.Invoke(obj,arguments);

Y lo puede guardar, le indico que es object, pero si sabemos que tipo de dato debe regresar (como en los plugins de mbloggy que uso una Interface pues no hay bronca).

O bien, darle propiedades al valor que va a regresar (la recomendada cuando tienen un return).

object retVal = my_method.Invoke(obj,
     BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod,
     null,
     arguments,
     null); 
 
Console.WriteLine(retVal);

Y listo!

¿Cuál es la clase Foo?

using System;
 
class Foo 
{
    public double Add(double h1, double h2) 
    {
        return (h1 + h2);
    }
 
}

Y listo, compilamos

$ mcs Foo.cs /t:library
$ mcs FooLoader.cs
$ mono FooLoader.exe Foo.dll
6,3

Le paso el argumento del nombre del archivo, pero si ya sabemos el nombre dle archivo pues se lo indicamos a LoadFrom(”archivo.dll”) y listo!, ¿fácil no?.