C #: directorio de assembly personalizado

Digamos que tenemos una aplicación que consta de un ejecutable y 5 bibliotecas. Regularmente, todos estos estarán en un directorio y las bibliotecas se cargarán desde allí.

¿Es posible hacerlo para que pueda tener, por ejemplo, algunas de las bibliotecas en un directorio llamado Lib, y el rest en una llamada Lib2? De modo que el directorio de la aplicación solo contuviera el ejecutable y los otros ensamblajes estarían contenidos en varios directorios lógicos.

¿Cómo puedo hacer esto? Y me gustaría saber cómo hacer la carga de los ensamblajes, pero también cómo hacer que la construcción de la aplicación coloque los ensamblajes en el directorio correcto.

Puede agregar rutas de búsqueda adicionales a su aplicación. Configúrelas para cargar ensamblajes. Por ejemplo

     

Puedes ver más detalles aquí .

Si desea administrar manualmente de dónde obtener ensamblajes, tiene dos posibilidades:

  1. Maneje el evento AppDomain.AssemblyResolve (como lo describe SLaks). Aquí está el fragmento de código:

     static void Main(string[] args) { ... AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); ... } static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { string assembliesDir = "your_directory"; Assembly asm = Assembly.LoadFrom(Path.Combine(assembliesDir, args.Name + ".dll")); return asm; } 
  2. Cree un dominio con su propia configuración (estableciendo las propiedades ApplicationBase o PrivateBinPath del objeto AppDomainSetup).

Entonces, si quiere continuar trabajando en el dominio actual, debe usar el método 1.

Para hacer que los ensamblados se copien automáticamente a la carpeta en la que desea que estén, puede configurar Copy Local en verdadero para todas las referencias y realizar un paso posterior a la creación para moverlos a subdirectorios.

De forma alternativa, puede configurar Copy Local en falso y agregar los archivos DLL a los que se hace referencia como archivos en el proyecto en los subdirectorios apropiados, y establecer Build Action para Copiar al directorio de salida (Esto conservará los subdirectorios)

La forma más flexible de hacer que el motor de ejecución los encuentre es manejar el evento AppDomain.AssemblyResolve y cargarlo manualmente usando Assembly.LoadFile . Necesitará una forma para que su código sepa qué ensamblajes están en qué directorios.

En tu comentario, mencionas agregar rutas y ubicaciones en tiempo de ejecución. Sí, puede, pero debe usar Assembly.Load () y posiblemente reflexión.