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?

Author: Kirill Kobelev, 2010-03-17

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>
 88
Author: Hemanshu Bhojak,
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.

 9
Author: Lauro Wolff Valente Sobrinho,
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.

 8
Author: Jørn Schou-Rode,
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

 2
Author: Jonathan Parker,
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