Usar diferentes versiones del mismo ensamblaje en la misma carpeta
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 A tengo el Castillo dll.DinamicProxy2.dll v2.2 y NHibernate dll. Ahora el problema es que NHibernate depende de Castle.DinamicProxy2.dll v2.1 que no está ahí. ¿Cómo resuelvo esta situación?
4 answers
Usé 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>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-17 11:20:02
Una cosa muy, muy, muy importante que uno podría pasar por alto si no está prestando suficiente atención.
El ensamblado que escriba en la etiqueta de versión de la base de código, debe ser strong named.
Desde el siguiente enlace: http://msdn.microsoft.com/en-us/library/efs781xb.aspx
Para ensamblados sin un nombre fuerte, la versión es ignorada y loader utiliza la primera aparición de
dentro . Si hay una entrada en el aplicación archivo de configuración que redirige el enlace a otro ensamblado, el redirección tendrá prioridad incluso si la versión del ensamblado no coincide con la solicitud de enlace.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-22 20:32:19
Una solución (o solución alternativa) sería instalar ambas versiones en la Caché de Ensamblado Global (GAC) en las máquinas en las que su software necesita ejecutarse, y hacer referencia a los ensamblados utilizando sus nombres fuertes. Esto supone que las asambleas tienen nombres fuertes.
Instalar en el GAC será una molestia si tiene más de unos pocos desarrolladores o si planea implementar su solución en muchos equipos (por ejemplo, como una aplicación de usuario final). En este caso, creo (pero podría ser incorrecto) 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 con NHibernate.dll
.
Puede usar una herramienta llamada ILMerge para fusionar los ensamblados. El comando que tendrá que ejecutar se ve algo como esto (no probado):
ILMerge /t:library /internalize /out:Deploy/NHibernate.dll
NHibernate.dll Castle.DynamicProxy2.dll
El conmutador /internalize
le dice a ILMerge que marque todos los tipos del segundo ensamblado (Castle en este caso) internal
en el ensamblado de salida. Sin esto, podría obtener errores de compilación cuando intente compilar un proyecto que haga referencia tanto a su nueva NHibernate.dll
como a la versión de estante de Castle.DynamicProxy2.dll
v2.2, ya que contendrán clases con los mismos nombres exactos.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-17 08:11:36
No creo que la solución de Hemanshu Bhojak sea buena, ya que no quieres 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-18 06:13:50