2011-01-17 20 views
17

Utilizando C#, creo una DLL en tiempo de ejecución y ahora quiero agregarla como referencia a mi proyecto en tiempo de ejecución.Agregar DLL mediante programación en el tiempo de ejecución

Intenté utilizar el método LoadFrom, pero no funciona.

¿Cómo puedo hacer esto?

+0

¿cuál es su necesidad de crear/añadir DLL en tiempo de ejecución? –

+0

¿Cómo está creando una DLL en tiempo de ejecución? –

+0

¿Desea agregar la referencia al proyecto VS en tiempo de ejecución? No tiene sentido. – leppie

Respuesta

4

Utilice el método Assembly.LoadFile y luego ejecute el código dentro de él utilizando la reflexión.

+0

unos segundos más rápido, +1 –

0

Puede usar el método Assembly.LoadFrom para cargar dinámicamente un conjunto en tiempo de ejecución.

1

No se puede agregar a un proyecto DLL cuando el proyecto ya está en ejecución. Sin embargo, puede cargar el dll usando Assembly.LoadFrom (filename). Normalmente, dicho escenario se utiliza para proyectos basados ​​en SOA o complementos. Puede usar la interfaz para especificar la estructura de tipo y cargar el dll y usarlo.

8

LoadFile vs LoadFrom

Ten cuidado - no son la misma cosa .

LoadFrom() pasa a través de la fusión y puede redirigido a otro conjunto en una trayectoria diferente pero con la misma identidad si uno ya está cargado en el contexto LoadFrom. LoadFile() no se vincula a través de Fusion en absoluto - el cargador simplemente sigue adelante y carga exactamente * lo que pidió la persona que llama. Es no utiliza el contexto Load o LoadFrom. Por lo tanto, LoadFrom() generalmente le ofrece lo que solicitó, pero no necesariamente. LoadFile() es para los que realmente quieren exactamente lo que se solicita. (* No obstante, a partir en la versión 2, la política se aplicará tanto a LoadFrom() y LoadFile(), por lo LoadFile() no será necesariamente exactamente lo que fue solicitado. Además, a partir de v2, si una asamblea con su identidad está en el GAC, la copia GAC ​​ se utilizará en lugar de utilizar ReflectionOnlyLoadFrom() para cargar exactamente lo que quiere -.. pero, tenga en cuenta que ensamblados cargados de esa manera no puede ser ejecutado )

LoadFile() tiene un truco. Dado que no utiliza un contexto de enlace, sus dependencias no están automáticamente en su directorio. Si no están disponibles en el contexto de carga, , tendría que suscribirse al evento AssemblyResolve para vincularlos al .

ref Suzanne Cook's .NET CLR Notes

24

En primer lugar debe cargar el archivo DLL

Assembly assembly = Assembly.LoadFrom("dllPath"); 

A continuación, puede que tenga que agregar el ensamblado al dominio de aplicación

AppDomain.CurrentDomain.Load(assembly.GetName()); 

Después de que usted puede cargar cualquier escriba desde este ensamblaje

Type t = assembly.GetType("typeName"); 

Luego, utilizando la reflexión se puede ejecutar métodos de este tipo

Tenga en cuenta que puede que tenga que añadir el siguiente en el archivo de configuración.

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <probing privatePath="dlls folder"/> 
    </assemblyBinding> 
</runtime> 
+0

gracias Ghyath Serhal, ¿podría explicarlo más? dónde puedo cambiar Mi configuración – Mahsa

+0

Primero ¿Cuál es su aplicación, es una aplicación web, aplicación de Windows, servicio de Windows? –

+0

Es una aplicación de Windows. – Mahsa

Cuestiones relacionadas