编译过程中出现mscorlib版本冲突

52
在进行全新的Win8.1安装并从备份中恢复了所有代码后,当我构建解决方案的主项目时,突然收到了来自Visual Studio的警告:
“Found conflicts between different versions of the same dependent assembly that could not be resolved. These reference conflicts are listed in the build log when log verbosity is set to detailed.”
我将输出日志级别设置为详细,并找到了一些像这样的条目:
“There was a conflict between "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" and "mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes". "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was chosen because it had a higher version.”
问题是,我在解决方案中没有引用`mscorlib`。我有几个应用程序需要.NET 3.5,但我无法看出它们之间有何关联。
一个不同之处:之前未发生此警告的旧Win8.1安装是独立的机器;而这次是域加入的。我不知道是否有影响(我看不出来),但我想至少提一下。

我遇到了同样的问题。 - Naveen Bathina
8个回答

30
在不同的项目中使用不同版本的Nuget包也可能会导致此问题。请确保您的所有包都具有相同的版本:
  1. (在Visual Studio中)右键单击解决方案
  2. 单击管理解决方案的Nuget包
  3. 单击整理选项卡
  4. 对于整理选项卡中的每个包,请为每个项目更新为相同版本的包。

这是正确的做法。对我们非常有效——清晰地展示了哪些软件包有多个版本,并提供了一键解决特定问题的方法——比完全重新安装要更合理得多。 - geekzster
16
如果在“合并”选项卡中没有要更新的软件包,是否有其他建议? - SuicideSheep
1
合并工具无法找到任何包,即使项目共享它们(至少在VS2019中不起作用) - MC9000

22

我通过在包管理器控制台中执行update-package -reinstall命令来解决了这个问题。

但是

请注意,更新解决方案中的所有软件包可能会导致其他问题,请确保在出现问题时可以回滚到一个良好版本!


1
这个问题一直困扰着我,谢谢你的提示! - Dr. Hilarius
10
注意,更新解决方案中的所有软件包可能会引起其他问题,请确保在出现问题时可以回滚到一个好的版本! - user1069816
2
@user1069816:是的,同意。 - InteXX
1
这是一个危险的解决方案。这可能会引入许多不必要的更改。Memet Olsen下面的答案是一个更加明智和安全的解决方案。 - geekzster
1
请注意,“update-package -reinstall”不会更新任何软件包引用-它只是重新安装已引用的软件包。这对您的项目不会造成任何损害。如果省略“-reinstall”参数,则您的项目将使用所有nuget软件包的最新版本进行更新,这可能是危险的。 - Dag Baardsen
显示剩余7条评论

12

通过删除我的解决方案中的“.suo”文件,然后重新打开解决方案,我已经成功解决了这个问题。然后我重新构建解决方案,问题就解决了。

“.suo”文件位于“.vs”文件夹中,通常我会删除它。

祝好运!


这听起来像是个好的技巧,肯定比完全重新安装软件包更便宜、更安全。下次出现这种情况的时候我会试一试(肯定会早晚出现的)。 - InteXX
这是我遇到问题时唯一有效的方法。当我更新了一个特定的包(System.Net.Http)后,详细模式输出中仍然显示mscorlib、System.Core和System存在冲突。当我删除了.suo文件并重新打开时,这些消息就消失了。 - Elek Guidolin

10

根据这个答案,我将详细程度设置为诊断级别,解决了这个问题。

之后我重建了解决方案,生成日志列出了依赖于两个不同版本的mscorlib的具体包。

在我的情况下,我的项目引用了System.Net.Http的2.0.20126.16343版本。我打开了NuGet包管理器,并将此包更新到最新版本(当时是4.3.4)。下次构建解决方案时,警告消失了。


1
我遵循了这个建议,发现这个问题与mscorlib无关!根本原因是缺少密钥库文件。 - Adrian Toman

7
我的解决方案比以上所有方法都要简单一些。我只需添加对这两个出错的程序集(System.Runtime.Serialization和mscorlib)的引用并重新构建项目即可。这样做,我指定了4.0.0.0版本并消除了歧义。
其中一个程序集(mscorlib)无法通过GUI添加,因为会出现“无法添加对‘mscorlib’的引用。该组件已由构建系统自动引用。”错误。
我需要打开.vbproj (.csproj)文件并手动添加引用,方法如下:
<Reference Include="mscorlib" />

3
我也成功了! - danicode

2
我尝试了以下所有方法,但都没有解决问题。
1. 使用命令“update-package -reinstall”。 2. 通过Consolidate选项卡更新和打包。 3. 删除“.suo”文件。
然而,我的问题是一个不同的情况,我猜测Xamarin.Forms包的新版本使用了不同版本的mscorlib。所以我将其降级,现在它可以正常工作了。
我建议您尝试以上所有解决方案,并尝试找出哪个包与之冲突。

1
我已经尝试了所有提出的解决方案,但都没有成功。
在我的项目中,此警告消息是由一个dll引用引起的,该引用依赖于与我的项目所针对的不同的.NET框架版本。
为了找出哪个dll引用导致了警告,我简单地使用.NET反编译器来探索每个dll引用,以找出哪个引用了不同的.NET框架(mscorlib)。
为了解决这个问题,引用的dll必须更新到一个与使用它的项目针对相同的.NET框架版本,如果存在这样的版本。
希望这可以帮助你。

1

按照Memet Olsen的建议,使用VS2017 Community...几乎是一模一样的:

  • 在“解决方案资源管理器”中右键单击解决方案。
  • 选择“管理解决方案的Nuget包”
  • 检查包。如果其中任何一个有蓝色向上箭头而不是绿色勾选,请使用“更新”按钮

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接