【问题标题】:Using different versions of the same assembly in the same folder在同一文件夹中使用同一程序集的不同版本
【发布时间】:2010-03-17 07:39:42
【问题描述】:

我有以下情况

项目A

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

项目 B

 - Uses NHibernate
 - Uses Castle Windsor v2.1

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

【问题讨论】:

  • 我不敢相信.net 在依赖处理和冲突方面做得如此糟糕。微软去看看 node 如何处理它的模块并复制那个模式!

标签: assemblies reference multiple-versions


【解决方案1】:

我使用以下配置解决了这个问题。

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

【讨论】:

  • dll放在哪里?是否在网站根目录中名为 v2.1 和 v2.2 的文件夹中?你能把dll放在bin文件夹的子目录中吗?
  • +1 表示唯一具有有效&lt;codeBase&gt; 解决方案的资源。 Jan,文件可以在任何地方,只需复制它们并调整文件名。
  • 对于网站,href 应以“bin\”开头,例如
  • 为了澄清@MoslemBenDhaou 的建议,如果“项目B”与v2.2 一起正常运行,bindingRedirect 会很有帮助;它只需要被告知使用v2.2 而不是构建它的版本(v2.1)。如果出于某种原因“项目 B”必须使用 完全 v2.1,则使用此处答案中显示的双 codeBase 方法。注意this answer - 要使两个代码库工作,程序集必须是强命名
  • 我在努力完成这项工作。我没有注意的是 web.config 在根文件夹中,因此相关链接找不到该文件。在阅读了上面@Cyclion 的评论后,一切正常。
【解决方案2】:

一件非常、非常、非常重要的事情,如果注意力不集中,可能会错过。

你在codeBase版本标签中写的程序集,必须是强命名的。

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

对于没有强名称的程序集,版本将被忽略,并且 loader 使用 的第一次出现在里面 。如果应用中有条目 将绑定重定向到另一个程序集的配置文件, 即使程序集版本没有重定向也将优先 匹配绑定请求。

【讨论】:

【解决方案3】:

一种解决方案(或解决方法)是将两个版本都安装在需要运行您的软件的计算机上的 全局程序集缓存 (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 在输出程序集中标记第二个程序集(在本例中为城堡)internal 中的所有类型。如果没有这个,当您尝试编译引用新的NHibernate.dll 和现成版本的Castle.DynamicProxy2.dll v2.2 的项目时,您可能会遇到编译错误,因为它们将包含具有完全相同名称的类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2010-09-08
    • 2011-05-17
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    相关资源
    最近更新 更多