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