And when they said I'm telling lies you believed me
- 24 June, 7:32am |
- mono
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.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
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).
BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod,
null,
arguments,
null);
Console.WriteLine(retVal);
Y listo!
¿Cuál es la clase Foo?
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?.