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

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?.