2010-06-15 74 views
6

在我的web应用程序中,我使用的是NHibernate.dll。这依赖于下面的汇编。如何解决.Net中冲突的程序集?

'Antlr3.Runtime,版本= 3.1.0.39271, 文化=中立, 公钥= 3a9cab8f8d22bfb7'

现在再要求我来介绍Antlr3.StringTemplate同一个项目。 dll。它依赖于上述程序集的另一个版本。

如果我使用Antlr3.Runtime.dll满足NHibernate的Antlr3.StringTemplate版本开始抱怨,反之亦然。

如何解决这样的情况?

回答

5

您可能可以在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

4

最简单的事情就是重新编译两个版本。或者,您可以从引用中删除版本规范(并将特定版本设置为false)。

1

我们不得不做吉姆羔羊建议的事情。我们构建了所有“第三方库”的本地版本(我们称之为它们),针对强名称和明确的依赖关系(与下载依赖另一个的dll时可能获得的内容相关)。我们将这些本地构建放入我们的存储库(Subversion)。然后,我们将得到的程序集放入依赖于这些程序集的每个项目根目录下的“Dependencies/lib”文件夹下。这使我们可以使用其相对路径位置功能将它们添加为VS引用。

1

我有同样的问题。

为您做了bindingredirect工作?

我已经尝试过这样的,但什么都没有改变:

<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的解决方案。 现在它完美的工作。