我目前正在开发一个.NET应用程序,它包含20个项目.其中一些项目是使用.NET 3.5编译的,其他一些项目仍然是.NET 2.0项目(到目前为止没问题).
问题是,如果我包含一个外部组件,我总会收到以下警告:
"Found conflicts between different versions of the same dependent assembly".
这个警告究竟是什么意思,是否有可能排除这个警告(比如在源代码文件中使用#pragma disable)?
此警告意味着两个项目引用相同的程序集(例如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谁在这个答案的评论中建议这一点).
基本上,当您引用的程序集将"Copy Local"设置为"True"时会发生这种情况,这意味着DLL的副本与您的exe一起放在bin文件夹中.
由于Visual Studio也会复制引用程序集的所有依赖项,因此最终可能会引用同一程序集的两个不同构建.如果您的项目位于单独的解决方案中,则更有可能发生这种情况,因此可以单独编译.
我得到的方法是将装配项目中的引用设置为Copy Local为False.仅对需要运行成品的程序集的可执行文件/ Web应用程序执行此操作.
希望有道理!
我想发布他们在上面的评论中提供的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之间存在冲突.
我的一个项目遇到了同样的问题,但是,上述任何一个都没有帮助解决警告.我检查了详细的构建日志文件,我使用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)
我希望以上显示我的意思,花了几个小时才发现,所以希望其他人也会受益.
在Visual Studio上,如果右键单击解决方案并且管理nuget包,则会出现"合并"选项卡,该选项卡将所有包设置为相同的版本.
我刚刚收到此警告消息并清理了解决方案并重新编译(Build - > Clean Solution)并且它消失了.
我有同样的问题,我通过在web.config中更改以下内容来解决.
它发生在我身上,因为我正在使用Newtonsoft.Json 4.0运行应用程序
从:
至: