【问题标题】:How to resolve conflicting assemblies in .Net?如何解决 .Net 中的冲突程序集?
【发布时间】:2010-06-15 16:42:03
【问题描述】:
在我的网络应用程序中,我使用的是 NHibernate.dll。这依赖于以下程序集。
'Antlr3.Runtime, 版本=3.1.0.39271,
文化=中立,
PublicKeyToken=3a9cab8f8d22bfb7'
现在在同一个项目中为了另一个需求我必须引入 Antlr3.StringTemplate.dll。它依赖于上述程序集的另一个版本。
如果我使用满足 NHibernate 的 Antlr3.Runtime.dll 版本,Antlr3.StringTemplate 开始抱怨,反之亦然。
如何解决这种情况?
【问题讨论】:
标签:
.net
asp.net
nhibernate
assemblies
assembly-resolution
【解决方案1】:
您可以在 web.config 中使用 assemblyBinding 将最新版本重定向到旧版本。
例子:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="NHibernate" publicKeyToken="aa95f207798dfdb4"/>
<bindingRedirect oldVersion="2.1.0.4000" newVersion="2.1.2.4000"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
这直接位于 web.config 中的 <configuration> 节点下。
你可以在这里阅读它:
http://msdn.microsoft.com/en-us/library/2fc472t2%28VS.71%29.aspx
【解决方案2】:
最简单的方法是针对同一版本重新编译两者。或者,您可以从参考中删除版本规范(并将特定版本设置为 false)。
【解决方案3】:
我们必须按照 Jim Lamb 的建议去做。我们构建了所有“第三方库”的本地版本(正如我们所称的那样),目标是强名称和显式依赖项(与下载依赖于另一个的 dll 时可能得到的内容相比)。我们将这些本地构建提交到我们的存储库(Subversion)中。然后我们将生成的程序集放在依赖于这些程序集的每个项目的根目录下的“Dependencies/lib”文件夹中。这允许我们使用其相对路径定位功能将它们添加为 VS 引用。
【解决方案4】:
我遇到了同样的问题。
绑定重定向对你有用吗?
我试过这样,但没有任何改变:
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Antlr3.Runtime" publicKeyToken="3a9cab8f8d22bfb7" culture="neutral" />
<bindingRedirect oldVersion="*" newVersion="3.1.3.6002" />
<publisherPolicy apply="no"/>
</dependentAssembly>
</assemblyBinding>
出现同样的错误。
所以我决定采用将旧版本 Antlr3.Runtime 程序集添加到 gac 的解决方案。
现在它完美运行了。