2010-12-15 17 views
13

Estoy trabajando con un ensamblado de un tercero y, lamentablemente, ahora necesito cargar su última versión y la anterior en mi proyecto, así que en tiempo de ejecución puedo decidir cuál cargar. Solo necesito uno, no los dos.Cargando múltiples versiones del mismo ensamblaje

Teniendo esto en cuenta, también dependo de los tipos proporcionados por los componentes, por lo que no puedo cargar desde la reflexión y consultar siempre el método/eventos/interfaces que deseo utilizar. He visto alguna mención de cómo manejar esto a través del AppDomain, pero no estoy seguro de cómo proceder.

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

Respuesta

0

Si tiene dos versiones diferentes del mismo componente, ¿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 versiones si alguna funcionalidad solo está en una de 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 el que no necesita después. Entonces podría ejecutar su lógica en el dominio de aplicación correcto, como se describe en How do I create an application domain and run my application in it?.

4

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

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

3rd party libraries refer to different versions of log4net.dll

Esa respuesta se refiere a este enlace:

Using different versions of the same assembly in the same folder

dentro de este hilo, hay una precaución sobre la carga de diferentes versiones de un mismo conjunto en el mismo contexto y las referencias 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 AssemblyResolve: Reference two equal assemblies, only public keys differ

7

Si ambos conjuntos son compatibles se pueden definir en el app.exe archivo .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 indica al cargador asembly siempre usar la versión 1.0.3300.0 no importa lo que se compila en el exe llamado. Lo mismo es posible con las versiones más nuevas de dotnet

Cuestiones relacionadas