assemblies - Usar diferentes versiones del mismo ensamblaje en la misma carpeta
reference multiple-versions (4)
No creo que la solución de Hemanshu Bhojak sea buena, ya que no quiere cargar dos versiones del mismo ensamblado en el mismo contexto. Este artículo explica por qué:
http://msdn.microsoft.com/en-us/library/dd153782.aspx#avoid_loading_multiple_versions
Tengo la siguiente situación
Proyecto A
- Uses Castle Windsor v2.2
- Uses Project B via WindsorContainer
Proyecto B
- Uses NHibernate
- Uses Castle Windsor v2.1
En la carpeta bin del Proyecto AI tienen el dll Castle.DynamicProxy2.dll v2.2 y NHibernate dlls. Ahora el problema es que NHibernate depende de Castle.DynamicProxy2.dll v2.1 que no está allí. ¿Cómo resuelvo esta situación?
Una cosa muy, muy, muy importante que uno podría perder si no está prestando suficiente atención.
El conjunto que escriba en la etiqueta de la versión codeBase, debe tener un nombre fuerte.
Desde el siguiente enlace: http://msdn.microsoft.com/en-us/library/efs781xb.aspx
Para los ensamblados sin un nombre seguro, la versión se ignora y el cargador utiliza la primera aparición de <codebase> dentro de <dependAssembly>. Si hay una entrada en el archivo de configuración de la aplicación que redirige el enlace a otro ensamblado, la redirección tendrá prioridad incluso si la versión del ensamblaje no coincide con la solicitud de vinculación.
Una solución (o solución alternativa) sería instalar ambas versiones en el caché de ensamblaje global (GAC) en la (s) máquina (s) en la cual su software necesita ejecutarse, y hacer referencia a los ensamblados usando sus nombres fuertes. Esto supone que las asambleas sí tienen nombres fuertes.
La instalación en el GAC será un problema si tiene más de unos pocos desarrolladores o si planea implementar su solución en muchas computadoras (por ejemplo, como una aplicación para el usuario final). En este caso, creo (pero podría estar equivocado) que su única opción es fusionar una de las dos versiones en el ensamblado que requiere esa versión. En su caso específico, necesita Castle.DynamicProxy2.dll
v2.1 para fusionarse en NHibernate.dll
.
Puede usar una herramienta llamada ILMerge para fusionar los ensamblajes. El comando que deberá ejecutar se ve de la siguiente manera (no probado):
ILMerge /t:library /internalize /out:Deploy/NHibernate.dll
NHibernate.dll Castle.DynamicProxy2.dll
El modificador /internalize
le dice a ILMerge que marque todos los tipos del segundo conjunto (Castle en este caso) internal
en el conjunto de salida. Sin esto, es posible que obtenga errores de compilación cuando intente compilar un proyecto que haga referencia tanto a su nuevo NHibernate.dll
como a la versión de estantería de Castle.DynamicProxy2.dll
v2.2, ya que contendrá clases con los mismos nombres exactos.
Utilicé la siguiente configuración para resolver el problema.
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Castle.DynamicProxy2" publicKeyToken="407dd0808d44fbdc" />
<codeBase version="2.1.0.0" href="v2.1/Castle.DynamicProxy2.dll" />
<codeBase version="2.2.0.0" href="v2.2/Castle.DynamicProxy2.dll" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Castle.Core" publicKeyToken="407dd0808d44fbdc" />
<codeBase version="1.1.0.0" href="v2.1/Castle.Core.dll" />
<codeBase version="1.2.0.0" href="v2.2/Castle.Core.dll" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>