警告:发现同一从属程序集的不同版本之间存在冲突
时间:2020-03-05 18:41:04 来源:igfitidea点击:
我目前正在开发一个.NET应用程序,该应用程序由20个项目组成。这些项目中有一些是使用.NET 3.5编译的,另一些仍然是.NET 2.0项目(到目前为止没有问题)。
问题是,如果我包括一个外部组件,我总是会收到以下警告:
"Found conflicts between different versions of the same dependent assembly".
该警告的确切含义是什么,并且有可能排除此警告(例如在源代码文件中使用#pragma disable)?
解决方案
回答
基本上,当我们引用的程序集将" Copy Local"设置为" True"时,就会发生这种情况,这意味着DLL的副本与exe一起放置在bin文件夹中。
由于Visual Studio也将复制引用程序集的所有依赖关系,因此最终可能会引用同一程序集的两个不同版本。如果项目位于单独的解决方案中,则更有可能发生这种情况,因此可以单独进行编译。
我解决的方法是将"复制本地"设置为False,以供装配项目中的引用使用。仅对需要组装才能运行成品的可执行文件/ Web应用程序执行此操作。
希望有道理!
回答
这实际上取决于外部组件。当我们在.NET应用程序中引用外部组件时,它将生成一个GUID来标识该组件。当一个项目引用的外部组件与另一个程序集中的另一个此类组件具有相同的名称和不同的版本时,就会发生此错误。
当我们使用"浏览"来查找引用并添加错误的程序集版本时,或者在代码存储库中该组件的版本与在本地计算机上安装的组件的版本不同时,有时会发生这种情况。
请尝试查找哪些项目存在这些冲突,从引用列表中删除组件,然后再次添加它们以确保我们指向的是同一文件。
回答
此警告意味着两个项目引用了相同的程序集(例如" System.Windows.Forms"),但是两个项目需要的版本不同。我们有几种选择:
- 重新编译所有项目以使用相同的版本(例如,将所有项目移至.Net 3.5)。这是首选选项,因为所有代码都以其编译时使用的依赖项版本运行。
- 添加绑定重定向。这样可以消除警告。但是,.Net 2.0项目将(在运行时)绑定到.Net 3.5版本的从属程序集,例如" System.Windows.Forms"。我们可以通过双击Visual Studio中的错误来快速添加绑定重定向。
- 使用
CopyLocal = true
。我不确定这是否会抑制警告。与上面的选项2一样,它意味着所有项目都将使用System.Windows.Forms的.Net 3.5版本。
以下是识别有问题的参考的几种方法:
- 我们可以使用一种实用程序,例如在https://gist.github.com/1553265上找到的实用程序。
- 另一种简单的方法是设置"生成"输出详细程度("工具","选项","项目和解决方案","生成和运行"," MSBuild"项目生成输出详细程度,"详细"),并在生成之后,在输出窗口中搜索警告,并查看其上方的文本。 。 (向宝可乐的帽子提示,后者在此答案的评论中建议了这一点)。