Cargar dll, ver sus propiedades y ejecutar sus métodos es realmente sencillo en .NET gracias System.Reflection, en este namespace incluso encontraremos System.Reflection.Emit que nos permitirá generar código IL en tiempo de ejecución.
Para ejecutar un método de una librería que carguemos en tiempo de ejecución seria algo así:
public static object Run() { Assembly As = Assembly.LoadFrom("MyLibrary.dll"); Type tipo = As.GetType("MyNameSpace.Class"); if (tipo == null) throw new Exception("No existe la clase en la Libreria"); MethodInfo method = tipo.GetMethod("MyMethod"); if (method == null) throw new Exception("No existe el metodo en la clase"); if (method.IsStatic) return method.Invoke(null, new object[] {"Param1","Param2"}); else return method.Invoke( Activator.CreateInstance (tipo), new object[] { "Param1", "Param2" }); }
En este ejemplo tanto los parámetros como los resultados son objects, esto puede crear algún problema si le pasamos al método un tipo de parámetro que no espera, o si nos devuelve un tipo que nosotros no esperamos.
La solución esta en los Interfaces, si al crear las dll que tenemos pensado usar con Reflection hacemos que las clases implemente un interface podremos ejecutar los métodos con parámetros y resultados tipados:
public interface IMyInterface { DateTime MyMethod(string par1, string par2); } public static DateTime Run() { Assembly As = Assembly.LoadFrom("MyLibrary.dll"); Type tipo = As.GetType("MyNameSpace.Class"); if (tipo == null) throw new Exception("No existe la clase en la Libreria"); if (tipo.GetInterface("IMyInterface") == null) throw new Exception("La clase debe implementar IMyInterface"); IMyInterface i = (IMyInterface)Activator.CreateInstance(tipo); return i.MyMethod("Par1", "Par2"); }


