当前位置:  开发笔记 > 编程语言 > 正文

警告:发现同一依赖程序集的不同版本之间存在冲突

如何解决《警告:发现同一依赖程序集的不同版本之间存在冲突》经验,为你挑选了7个好方法。

我目前正在开发一个.NET应用程序,它包含20个项目.其中一些项目是使用.NET 3.5编译的,其他一些项目仍然是.NET 2.0项目(到目前为止没问题).

问题是,如果我包含一个外部组件,我总会收到以下警告:

"Found conflicts between different versions of the same dependent assembly".

这个警告究竟是什么意思,是否有可能排除这个警告(比如在源代码文件中使用#pragma disable)?



1> Brian Low..:

此警告意味着两个项目引用相同的程序集(例如System.Windows.Forms),但这两个项目需要不同的版本.你有几个选择:

    重新编译所有项目以使用相同的版本(例如,将所有项目全部移至.Net 3.5).这是首选选项,因为所有代码都使用它们编译的依赖项版本运行.

    添加绑定重定向.这将抑制警告.但是,您的.Net 2.0项目将(在运行时)绑定到.Net 3.5版本的依赖程序集,例如System.Windows.Forms.您可以通过双击Visual Studio中的错误来快速添加绑定重定向.

    使用CopyLocal=true.我不确定这是否会抑制警告.它将像上面的选项2一样,意味着所有项目都将使用.Net 3.5版本的System.Windows.Forms.

以下是识别违规参考的几种方法:

您可以使用https://gist.github.com/1553265上的实用程序

另一个简单的方法是设置构建输出详细程度(工具,选项,项目和解决方案,构建和运行,MSBuild项目构建输出详细程度,详细),并在构建后,在输出窗口中搜索警告,并查看其上方的文本. (帽子提示pauloya谁在这个答案的评论中建议这一点).


查找"违规引用"的最简单方法是设置构建输出详细程度(工具,选项,项目和解决方案,构建和运行,MSBuild项目构建输出详细程度,详细信息),构建后,搜索输出窗口警告.见上面的文字.
只需一个快速的方法来找到它没有实用程序 - 如果你确实添加了绑定重定向(作为选项2),它将显示所涉及的引用 - 如果需要,您可以使用其他方法之一处理它,并从配置文件中删除绑定重定向.
如果他们不是您自己项目的参考怎么办?例如,我引用了一个项目,该项目依赖于Newtonsoft.Json,Version = 6.0.0.0,我引用了另一个项目,该项目依赖于Newtonsoft.Json,Version = 4.5.0.0
通过双击警告绑定重定向(步骤2)不会删除我的警告.我看到app.config添加了我怀疑是原因的程序集,但是在清理/重建之后警告仍然存在.另外尝试了第3步,没有运气.有任何想法吗?
@ brian-low,我可以建议在链接实用程序旁边添加Build输出详细程度设置(如@pauloya的评论中所示)作为选项吗?(免责声明,我实际上试图编辑答案来做到这一点,但它在审查时被拒绝:))
此处链接也是+1.快速解决了我的问题.

2> Matt Hamilto..:

基本上,当您引用的程序集将"Copy Local"设置为"True"时会发生这种情况,这意味着DLL的副本与您的exe一起放在bin文件夹中.

由于Visual Studio也会复制引用程序集的所有依赖项,因此最终可能会引用同一程序集的两个不同构建.如果您的项目位于单独的解决方案中,则更有可能发生这种情况,因此可以单独编译.

我得到的方法是将装配项目中的引用设置为Copy Local为False.仅对需要运行成品的程序集的可执行文件/ Web应用程序执行此操作.

希望有道理!



3> user1477388..:

我想发布他们在上面的评论中提供的pauloya解决方案.我相信这是找到违规参考的最佳解决方案.

查找"违规引用"的最简单方法是设置构建输出详细程度(工具,选项,项目和解决方案,构建和运行,MSBuild项目构建输出详细程度,详细信息),构建后,搜索输出窗口警告.见上面的文字.

例如,当您在输出面板中搜索"冲突"时,您可能会发现以下内容:

3>  There was a conflict between "EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" and "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089".
3>      "EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was chosen because it was primary and "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was not.

如您所见,EF版本5和6之间存在冲突.



4> Gorgsenegger..:

我的一个项目遇到了同样的问题,但是,上述任何一个都没有帮助解决警告.我检查了详细的构建日志文件,我使用AsmSpy来验证我在受影响的解决方案中为每个项目使用了正确的版本,我仔细检查了每个项目文件中的实际条目 - 没有任何帮助.

最终它发现问题是我在一个项目中的一个引用的嵌套依赖项.该引用(A)又需要不同版本的(B),它直接从我的解决方案中的所有其他项目引用.更新引用项目中的引用解决了它.

Solution A
+--Project A
   +--Reference A (version 1.1.0.0)
   +--Reference B
+--Project B
   +--Reference A (version 1.1.0.0)
   +--Reference B
   +--Reference C
+--Project C
   +--Reference X (this indirectly references Reference A, but with e.g. version 1.1.1.0)

Solution B
+--Project A
   +--Reference A (version 1.1.1.0)

我希望以上显示我的意思,花了几个小时才发现,所以希望其他人也会受益.



5> Tiago Gouvêa..:

在Visual Studio上,如果右键单击解决方案并且管理nuget包,则会出现"合并"选项卡,该选项卡将所有包设置为相同的版本.



6> MoMo..:

我刚刚收到此警告消息并清理了解决方案并重新编译(Build - > Clean Solution)并且它消失了.


直到你重建解决方案为止

7> 小智..:

我有同样的问题,我通过在web.config中更改以下内容来解决.

它发生在我身上,因为我正在使用Newtonsoft.Json 4.0运行应用程序

从:


  
  

至:


  
  

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有