Cargando archivos DLL en tiempo de ejecución en C #

Estoy intentando descubrir cómo podría importar y usar un .dll en tiempo de ejecución dentro de una aplicación C #. Usando Assembly.LoadFile () He logrado que mi progtwig cargue el dll (esta parte definitivamente funciona, ya que puedo obtener el nombre de la clase con ToString ()), sin embargo, no puedo usar el ‘Output’ método desde dentro de mi aplicación de consola. Estoy comstackndo el .dll luego moviéndolo al proyecto de mi consola. ¿Hay algún paso adicional entre CreateInstance y poder usar los métodos?

Esta es la clase en mi DLL:

namespace DLL { using System; public class Class1 { public void Output(string s) { Console.WriteLine(s); } } } 

y aquí está la aplicación que quiero cargar la DLL

 namespace ConsoleApplication1 { using System; using System.Reflection; class Program { static void Main(string[] args) { var DLL = Assembly.LoadFile(@"C:\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\DLL.dll"); foreach(Type type in DLL.GetExportedTypes()) { var c = Activator.CreateInstance(type); c.Output(@"Hello"); } Console.ReadLine(); } } } 

Los miembros deben poder resolverse en el momento de la comstackción para ser llamados directamente desde C #. De lo contrario, debe usar reflexión o objetos dynamics.

Reflexión

 namespace ConsoleApplication1 { using System; using System.Reflection; class Program { static void Main(string[] args) { var DLL = Assembly.LoadFile(@"C:\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\DLL.dll"); foreach(Type type in DLL.GetExportedTypes()) { var c = Activator.CreateInstance(type); type.InvokeMember("Output", BindingFlags.InvokeMethod, null, c, new object[] {@"Hello"}); } Console.ReadLine(); } } } 

Dinámico (.NET 4.0)

 namespace ConsoleApplication1 { using System; using System.Reflection; class Program { static void Main(string[] args) { var DLL = Assembly.LoadFile(@"C:\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\DLL.dll"); foreach(Type type in DLL.GetExportedTypes()) { dynamic c = Activator.CreateInstance(type); c.Output(@"Hello"); } Console.ReadLine(); } } } 

En este momento, está creando una instancia de cada tipo definido en el ensamblaje . Solo necesita crear una única instancia de Class1 para llamar al método:

 class Program { static void Main(string[] args) { var DLL = Assembly.LoadFile(@"C:\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\DLL.dll"); var theType = DLL.GetType("DLL.Class1"); var c = Activator.CreateInstance(theType); var method = theType.GetMethod("Output"); method.Invoke(c, new object[]{@"Hello"}); Console.ReadLine(); } } 

Debe crear una instancia del tipo que expone el método de Output :

 static void Main(string[] args) { var DLL = Assembly.LoadFile(@"C:\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\DLL.dll"); var class1Type = DLL.GetType("DLL.Class1"); //Now you can use reflection or dynamic to call the method. I will show you the dynamic way dynamic c = Activator.CreateInstance(class1Type); c.Output(@"Hello"); Console.ReadLine(); } 

Activator.CreateInstance() devuelve un objeto, que no tiene un método de salida.

Parece que proviene de lenguajes de progtwigción dynamics? C # definitivamente no es eso, y lo que estás tratando de hacer será difícil.

Ya que está cargando un dll específico desde una ubicación específica, ¿tal vez solo desea agregarlo como referencia a su aplicación de consola?

Si absolutamente desea cargar el conjunto a través de Assembly.Load , tendrá que ir a través de la reflexión para llamar a cualquier miembro de c

Algo así como type.GetMethod("Output").Invoke(c, null); Deberías hacerlo.

No es tan difícil.

Puede inspeccionar las funciones disponibles del objeto cargado, y si encuentra el que está buscando por su nombre, busque sus parms esperados, si los tiene. Si es la llamada que está tratando de encontrar, llámela utilizando el método Invoke del objeto MethodInfo.

Otra opción es simplemente construir sus objetos externos a una interfaz, y lanzar el objeto cargado a esa interfaz. Si tiene éxito, llame a la función de forma nativa.

Esto es bastante simple.