c# assemblies appdomain multiple-versions

c# - Cargando mĂșltiples versiones del mismo ensamblaje.



assemblies appdomain (4)

Aquí hay un par de publicaciones desde aquí en SO que describen cómo cargar varias versiones del mismo conjunto:

Esta publicación describe cómo hacer referencia a dos versiones diferentes de log4net. Vea el comentario de @Joe B. en la respuesta aceptada para obtener un poco más de detalles sobre cómo resolvió exactamente su problema.

Las bibliotecas de terceros se refieren a diferentes versiones de log4net.dll

Esa respuesta se refiere a este enlace:

Usando diferentes versiones del mismo ensamblaje en la misma carpeta.

Dentro de este hilo, hay una precaución sobre la carga de diferentes versiones del mismo ensamblaje en el mismo contexto y hace referencia a este enlace en MSDN:

http://msdn.microsoft.com/en-us/library/dd153782.aspx#avoid_loading_multiple_versions

Aquí hay otro con una respuesta que sugiere el uso de AssemblyResolve: Referencia a dos conjuntos iguales, solo las claves públicas difieren

Estoy trabajando con un ensamblado de terceros y, lamentablemente, ahora tengo que cargar su última versión y una versión anterior en mi proyecto para que, en el tiempo de ejecución, pueda decidir cuál cargar. Solo necesito uno, no ambos.

Teniendo esto en cuenta, también dependo de los tipos proporcionados por los componentes, por lo que no puedo cargar la reflexión y la consulta cada vez para el método / eventos / interfaces que quiero usar. He visto alguna mención de cómo manejar esto a través de AppDomain s, pero no estoy seguro de cómo proceder.

¿El proceso consistiría en codificar contra una versión del componente y luego en tiempo de ejecución (usando el AppDomain ) intercambiar la DLL correcta que deseo consumir? ¿Entonces solo estaría manejando esto al inicio?


Aquí hay una entrada de blog con una solución, también consulte este subproceso SO here


Si ambos conjuntos son compatibles, puede definirlos en el archivo app.exe.config o web.config para usar siempre la nueva versión declarando bindingRedirect.

ejemplo

<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1" appliesTo="v1.0.3705"> <dependentAssembly> <assemblyIdentity name="Regcode" publicKeyToken="b03f5f7f11d50a3a" culture=""/> <bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="1.0.3300.0"/> </dependentAssembly> </assemblyBinding> </runtime> </configuration>

esta entrada de configuración para dotnet 1.0 le dice al cargador de ensamblaje que siempre use la versión 1.0.3300.0 sin importar lo que se compile en el exe llamante. Lo mismo es posible con las nuevas versiones dotnet.


Si tiene dos versiones diferentes del mismo componente, esto significa que ambas versiones pueden diferir no solo en la implementación sino también en el número de operaciones que exponen. Si este es el caso, ¿cómo puede cambiar las versiones si alguna funcionalidad está solo en una de las dos versiones?

De todos modos, si desea cargar las dos versiones, tendría que hacerlo en dos dominios de aplicación separados, porque luego puede descargar la que no necesita más adelante. Luego, puede ejecutar su lógica en el dominio de aplicación correcto, como se describe en ¿Cómo creo un dominio de aplicación y ejecuto mi aplicación en él? .