67

我有以下情况

项目A

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

项目 B

 - Uses NHibernate
 - Uses Castle Windsor v2.1

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

4

3 回答 3

96

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

<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>
于 2010-03-17T11:20:02.113 回答
11

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

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

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

对于没有强名称的程序集,版本将被忽略,加载程序使用 <dependentAssembly> 中第一次出现的 <codebase>。如果应用程序配置文件中有一个条目将绑定重定向到另一个程序集,则即使程序集版本与绑定请求不匹配,重定向也会优先。

于 2013-09-20T16:24:41.507 回答
9

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

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

您可以使用名为ILMerge的工具来合并程序集。您需要运行的命令如下所示(未经测试):

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

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

于 2010-03-17T08:01:59.060 回答