在同一文件夹中使用同一程序集的不同版本

时间:2010-03-17 07:39:42

标签: assemblies reference multiple-versions

我有以下情况

项目A

 - Uses Castle Windsor v2.2
 - Uses Project B via WindsorContainer

项目B

 - Uses NHibernate
 - Uses Castle Windsor v2.1

在Project A的bin文件夹中,我有dll Castle.DynamicProxy2.dll v2.2和NHibernate dll。现在问题是NHibernate依赖于Castle.DynamicProxy2.dll v2.1而不存在。我该如何解决这种情况。

4 个答案:

答案 0 :(得分:90)

我使用以下配置来解决此问题。

<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>

答案 1 :(得分:9)

一个解决方案(或解决方法)是在您的软件需要运行的机器上的全局程序集缓存(GAC)中安装这两个版本,并使用它们引用程序集强大的名字。这假设程序集确实具有强名称。

如果您有多个开发人员,或者您计划将解决方案部署到许多计算机(例如,作为最终用户应用程序),那么安装到GAC将是一件痛苦的事。在这种情况下,我相信(但我可能错了)你唯一的选择是将两个版本之一合并到需要该版本的程序集中。在您的具体情况下,您需要将Castle.DynamicProxy2.dll v2.1合并到NHibernate.dll

您可以使用名为ILMerge的工具合并程序集。您需要运行的命令看起来像这样(未经测试):

ILMerge /t:library /internalize /out:Deploy/NHibernate.dll
    NHibernate.dll Castle.DynamicProxy2.dll

/internalize开关告诉ILMerge在输出程序集中标记第二个程序集(本例中为Castle)internal中的所有类型。如果没有这个,当您尝试编译引用新NHibernate.dllCastle.DynamicProxy2.dll v2.2的货架版本的项目时,可能会出现编译错误,因为它们将包含具有完全相同名称的类。 / p>

答案 2 :(得分:9)

如果他没有给予足够的重视,可能会错过一件非常非常非常重要的事情。

您在codeBase版本标记中编写的程序集必须强名称。

从以下链接:http://msdn.microsoft.com/en-us/library/efs781xb.aspx

  

对于没有强名称的程序集,将忽略版本并且   loader使用&lt; codebase&gt;的第一个外观内   &LT; dependentAssembly取代。如果申请中有条目   将绑定重定向到另一个程序集的配置文件   即使程序集版本不重要,重定向也会优先   匹配绑定请求。

答案 3 :(得分:2)

我不认为Hemanshu Bhojak的解决方案很好,因为你不想将同一个程序集的两个版本加载到同一个上下文中。本文解释了原因:

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