c# - inventor - carpintero del desierto
Cargando ensambles y sus dependencias (3)
Mi aplicación carga dinámicamente ensamblajes en tiempo de ejecución desde subcarpetas específicas. Estos ensamblados se compilan con dependencias a otros ensamblados. El tiempo de ejecución intenta cargarlos desde el directorio de la aplicación. Pero quiero ponerlos en el directorio de módulos.
¿Hay alguna forma de decirle al tiempo de ejecución que los dlls están en una subcarpeta separada?
Puede usar el elemento <codeBase>
que se encuentra en el archivo de configuración de la aplicación. Más información sobre " Ubicación del ensamblado a través de bases de código o sondeo ".
Bueno, el ensamblaje cargado no tiene un archivo de configuración de la aplicación.
Bueno, si conoce las carpetas específicas en tiempo de ejecución, puede usar Assembly.LoadFrom .
Puede usar el elemento <probing>
en un archivo de manifiesto para indicarle a Runtime que busque en los diferentes directorios sus archivos de ensamblaje.
http://msdn.microsoft.com/en-us/library/823z9h8w.aspx
p.ej:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin2/subbin;bin3"/>
</assemblyBinding>
</runtime>
</configuration>
Un buen enfoque que he usado últimamente es agregar un controlador de eventos para el evento AssemblyResolve de AppDomain.
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
Luego, en el método del controlador de eventos, puede cargar el ensamblado que se intentó resolver usando uno de los parámetros Assembly.Load, Assembly.LoadFrom y devolverlo desde el método.
EDITAR:
En función de su información adicional, creo que el uso de la técnica anterior, que resuelve específicamente las referencias a un ensamblaje, es el único enfoque real que funcionará sin reestructurar su aplicación. Lo que le da es que la ubicación de cada ensamblaje que el CLR no puede resolver puede ser determinada y cargada por su código en el tiempo de ejecución ... Lo he usado en situaciones similares tanto para arquitecturas conectables como para una integridad de referencia de ensamblaje herramienta de escaneo.