2009-07-06 20 views
25

Soy completamente nuevo para cargar en bibliotecas como esta, pero aquí es donde me paro:Cargar un archivo .DLL y acceder a los métodos de clase dentro?

Tengo un archivo DLL hecho en casa, es tan simple como se consigue, la clase en sí y un método. En el programa de inicio que carga esta biblioteca, tengo:

Assembly testDLL = Assembly.LoadFile("C:\\dll\\test.dll"); 

Desde aquí, estoy atascado. Hasta donde sé, lo está cargando correctamente porque me da errores cuando cambio el nombre.

¿Qué hago desde aquí? ¿Cómo exactamente cargo los métodos de la clase &?

Gracias.

+0

¿Hay alguna razón en particular por la que necesite usar la reflexión para cargar dinámicamente esta dll? si no, entonces usa la respuesta de Lunchy. –

Respuesta

32

Utilice Assembly.GetTypes() para obtener una colección de todos los tipos, o Assembly.GetType(name) para obtener un tipo particular.

Puede crear una instancia del tipo con un constructor sin parámetros usando Activator.CreateInstance(type) u obtener los constructores usando Type.GetConstructors e invocarlos para crear instancias.

Del mismo modo se puede obtener con métodos Type.GetMethods() etc.

Básicamente, una vez que tienes un tipo hay un montón de cosas que puede hacer - vistazo a la member list para más información. Si te quedas atascado tratando de realizar una tarea en particular (los genéricos pueden ser complicados) solo haz una pregunta específica y estoy seguro de que podremos ayudar.

3

Si desea dinámicamente cargar un ensamblado, y luego invocar los métodos de las clases en el mismo, debe realizar alguna forma de invocación dinámica.

Comprobar here de consejos básicos sobre eso.

La única parte que falta es cómo conseguir el tipo en sí, que puede ser fácilmente recuperada wth código como este:

foreach (Type t in assemblyToScan.GetTypes()) 
     { 
      if(condition) 
       //do stuff 
     } 

Y si simplemente desea utilizar el conjunto de forma estática (por que tiene el conjunto disponible en tiempo de compilación), entonces la respuesta de fom Launcy aquí en esta página es el camino a seguir.

11

Así es como puede obtener las clases si conoce el tipo.

Assembly assembly = Assembly.LoadFrom("C:\\dll\\test.dll"); 

// Load the object 
string fullTypeName = "MyNamespace.YourType"; 

YourType myType = assembly.CreateInstance(fullTypeName); 

El nombre completo del tipo es importante. Como no está agregando el archivo .dll, no puede hacer un Uso porque no está en su proyecto.

Si desea que todos me acaba de Jon Skeet respuesta.

+1

Lo siento si exploto esta respuesta suya desde la tumba. Me he estado preguntando si es posible acceder a las interfaces de la misma manera. Es decir, si el dll contiene un "MyNamespace.MyInterface", ¿cómo lo hago? Es decir, en su ejemplo "YourType" es conocido por el cargador dll. ¿Qué pasa si no lo es pero lo sé y sus métodos por su nombre, es decir, porque están documentados en alguna parte? – manu3d

+0

@ manu3d Sí, puedes. Funciona de la misma manera, simplemente reemplace su tipo con la interfaz. –

Cuestiones relacionadas