发现无法解决的相同从属程序集的不同版本之间的冲突


371

当我清理并构建具有多个项目的解决方案时,输出窗口将报告构建成功。但是,当我查看“ 错误列表窗口”时,它显示以下警告:

发现无法解决的相同从属程序集的不同版本之间的冲突。将日志详细程度设置为“详细”时,这些参考冲突会在构建日志中列出。C:\ Program Files(x86)\ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets

当我双击此消息时,它将打开C:\ Program Files(x86)\ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets文件,但其中的任何内容我都不明白。

我正在将Visual Studio Express 2013用于Web。

如何找出问题所在以及哪个DLL,然后如何使警告消失?



Answers:


513

eta:SO自己的@Nick Craver上有一篇杀手article,您应该阅读


虽然其他回应都这样说,但他们并未明确指出,所以我会...。

在VS2013.2上,要实际触发所引用信息的发布,您无需阅读该消息,该消息显示:

C:\ Program Files(x86)\ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets(1697,5):警告MSB3277:发现无法解决的相同从属程序集的不同版本之间存在冲突。将日志详细程度设置为 detail时,这些参考冲突会在构建日志中列出。

这是不正确的(或者至少是某些版本的Visual Studio的-在最新的VS2015 Update 3或更高版本上似乎可以)。而是将其转到Diagnostic(从“ 工具”->“选项”->“项目和解决方案”->“构建和运行”,设置MSBuild项目的构建输出详细程度),随后您将看到以下消息:

“ Newtonsoft.Json,版本= 6.0.0.0,文化=中性,PublicKeyToken = 30ad4fe6b2a6aeed”和“ Newtonsoft.Json,版本= 6.0.5.17707,文化=中性,PublicKeyToken = 30ad4fe6b2a6aeed”之间存在冲突。

  • 选择“ Newtonsoft.Json,版本= 6.0.0.0,文化=中性,PublicKeyToken = 30ad4fe6b2a6aeed”,因为它是主要的,而未选择“ Newtonsoft.Json,版本= 6.0.5.17707,文化=中性,PublicKeyToken = 30ad4fe6b2a6aeed”。

然后

  • Ctrl-Alt-O 转到构建输出窗口
  • 搜索“ 被选择 ”以查找明细。

...是的,对于那些查看[诊断]消息详细信息的人来说,这是一个无聊的6.x6.0.0.0消息,镇上有一个约定,所有版本在内部都是Assembly Version ,即只有SemVer Major组件才能进入Assembly版本 :)


3
谢谢-使用Visual Studio多年,从未遇到过需要在构建日志中进行深入研究的问题。不同的问题,但是意识到我正在寻找的信息正在某个地方发出,这解决了我的问题。
蒂莫西·李·罗素

4
详细的日志级别似乎可以在VS内部使用(因此不需要诊断)。不会是第一次,虽然这里面的MSBuild VS行为有所不同....
约翰内斯·鲁道夫

105
要从菜单“工具”->“选项”更改日志详细程度,然后找到“项目和解决方案”
Jenn 2015年

3
就我而言,我遇到了三个冲突,其中一个冲突是另外两个冲突的原因。我将“详细的”构建日志复制到记事本,搜索“冲突”,更新了NuGet程序包以获取我认可的参考,此问题已解决。
艾萨克·莱曼

@robotnik感谢您的编辑建议(其他人拒绝了)。实际上,我已经在答案的底部添加了信息,但是希望现在的答案与您预期的一样清晰。
Ruben Bartelink '16

76

运行msbuild Foo.sln /t:Rebuild /v:diag(从C:\Program Files (x86)\MSBuild\12.0\bin)以从命令行构建解决方案,并获得更多详细信息,然后找到.csproj.记录警告并检查其引用以及使用相同版本的相同通用程序集的其他项目的引用。

编辑:您也可以直接在VS2013中设置构建详细程度。转到Tools> Options菜单,然后转到Projects and Solutions并将MSBuild详细级别设置为Diagnostic

编辑:很少澄清,因为我自己一个人。在我的情况下,警告是由于我使用Resharper提示符而不是“添加引用”对话框添加了引用,即使v4和v12都可以选择,该对话框也没有版本。

<Reference Include="Microsoft.Build, Version=12.0.0.0, ..." />
<Reference Include="Microsoft.Build.Framework" />

<Reference Include="Microsoft.Build, Version=12.0.0.0, ..." />
<Reference Include="Microsoft.Build.Framework, Version=12.0.0.0, ..." />

在MSBuild日志中,其/v:diag详细程度如下所示。提供两个参考有冲突的细节:

  There was a conflict between 
  "Microsoft.Build.Framework, Version=4.0.0.0, ..." and 
  "Microsoft.Build.Framework, Version=12.0.0.0, ...". (TaskId:16)

      "Microsoft.Build.Framework, Version=4.0.0.0, ..." was chosen because it was primary and 
      "Microsoft.Build.Framework, Version=12.0.0.0, ..." was not. (TaskId:16)

      References which depend on "Microsoft.Build.Framework, Version=4.0.0.0, ..." 
      [C:\...\v4.5.1\Microsoft.Build.Framework.dll]. (TaskId:16)

          C:\...\v4.5.1\Microsoft.Build.Framework.dll (TaskId:16)
            Project file item includes which caused reference "C:\...\v4.5.1\Microsoft.Build.Framework.dll". (TaskId:16)
              Microsoft.Build.Framework (TaskId:16)

      References which depend on "Microsoft.Build.Framework, Version=12.0.0.0, ..." 
      [C:\...\v12.0\Microsoft.Build.Framework.dll]. (TaskId:16)

          C:\...\v12.0\Microsoft.Build.dll (TaskId:16)
            Project file item includes which caused reference "C:\...\v12.0\Microsoft.Build.dll". (TaskId:16)
              Microsoft.Build, Version=12.0.0.0, ... (TaskId:16)

          C:\...\v12.0\Microsoft.Build.Engine.dll (TaskId:16)
            Project file item includes which caused reference "C:\...\v12.0\Microsoft.Build.Engine.dll". (TaskId:16)
              Microsoft.Build, Version=12.0.0.0, ... (TaskId:16)

C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1697,5): warning MSB3277: 
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. 
[C:\Users\Ilya.Kozhevnikov\Dropbox\BuildTree\BuildTree\BuildTree.csproj]

10
我最终将该命令传递到日志文件,因此可以更轻松地查看它:msbuild "Foo.sln" /t:Rebuild /v:d > build.log
CrazyPyro 2014年

2
到达终端的最佳方法是:stackoverflow.com/a/22702405/268066
CrazyPyro 2014年

@CrazyPyro msbuild有一个“内置”管道-- /l:FileLogger,Microsoft.Build.Engine;logfile=build.log请在此处
drzaus

3
“构建日志”在哪里?我如何找到它?
囚犯零

此答案显示了如何从msbuild中获取更多详细信息,这是单用户关心的问题。所有其他答案均假定您正在使用VS并在Windows环境中运行。
无条件恢复莫妮卡

39

我只能通过比较显示的两个消息来支持鲁宾的答案:

在此处输入图片说明

和消息:

C:\ Program Files(x86)\ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets(1697,5):警告MSB3277:发现无法解决的相同从属程序集的不同版本之间存在冲突。这些参考冲突在构建日志中列出当日志级别设置为详细

因此,鲁宾是对的-这不是事实。没有任何冲突,只是缺少一个程序集。当项目是ASP.NET应用程序时,这尤其无聊,因为视图是按需编译的,也就是在第一次显示之前。这是当有必要使该组件可用时。(有一个选项可以与其他代码一起预编译视图,但这是另一回事了。)另一方面,如果将详细程度设置为Diagnostic,则会得到以下输出:

C:\ Program档案(x86)\ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets(1697,5):警告MSB3245:无法解析此参考。无法找到程序集“ System.Web.Razor,版本= 3.0.0.0,区域性=中性,PublicKeyToken = 31bf3856ad364e35,processorArchitecture = MSIL”。检查以确保程序集在磁盘上。如果您的代码需要此引用,则可能会出现编译错误。

结果,您需要做的是:

  1. 手动添加对程序集的引用(将其定位在磁盘上,也许是GAC上,并将其添加为“直接”引用),或者
  2. 使用NuGet软件包(如果在图库中发布)下载并引用其中包含的程序集。

在此处了解有关NuGet画廊的更多信息。有关在此处预编译ASP.NET视图的更多信息。


在VS 2017中,当我将“ MSBuild项目生成输出详细程度”(不是日志文件)设置为“详细(非诊断)”时,在“输出”窗口中出现“无法找到程序集”错误。
ALEXintlsos

@ALEXintlsos:显然,此功能已更改;无论在何处,您仍然会收到错误-请按照说明进行操作以消除错误。
亚历山大·克里斯托夫

22

在Visual Studio中更改构建详细程度将有助于指出正确的方向。请按照以下步骤更改VS中的详细程度

  1. 转到VS中的“工具”->“选项”菜单
  2. 打开项目和解决方案->构建并运行
  3. 更改MSBuild项目生成输出详细程度的值。选择一个距离QuietMinimalNormalDetailedDiagnostic

在VS中检查输出窗口(Ctrl+ Alt+ O),以查看构建日志中的更改。


16

然后如何使警告消失?

您可能需要重新安装或升级NuGet软件包才能解决此问题。


2
这与在拒绝正确重新安装软件包时重新启动Visual Studio的组合为我解决了该问题。
Ohad Schneider 2014年

22
最简单的检查方法:右键单击解决方案-> Manage NuGet packages for solution->在下面,Consolidate您可以查看是否安装了同一软件包的不同版本
elshev

16

重申@elshev的评论之一,右键单击解决方案->管理解决方案的NuGet软件包->在“合并”下,您可以查看是否已安装同一软件包的不同版本。在此处更新软件包。冲突错误已解决。


1
这对我没有解决。我必须卸载Newtonsoft.JSON并通过NuGet重新安装。这更新了对其他软件包的依赖。
Garr Godfrey

当我使用Resharper之类的工具时也会发生这种情况,该工具会自动添加缺少的DLL引用。“始终使用nuget添加”可能是一个很好的建议。
Shaswat Rungta '17

它对我不起作用,因为卸载软件包会尝试构建,因为软件包冲突而无法进行构建。因此,我什至无法重新安装该软件包:(
nickornotto

8

我正在使用Visual Studio 2017,并且在更新一些Nuget程序包时遇到了此问题。对我有用的是打开我的web.config文件并找到该<runtime><assemblyBinding>节点并将其删除。保存web.config并重建项目。

看着Error List窗户。您将看到关于绑定冲突的长篇警告。双击它,它将自动<runtime><assemblyBinding>使用正确的映射重新创建块。




3

显然,有很多不同的原因,因此有很多解决此问题的方法。为了使我的想法更全面,我们将以前在我们的Web项目中直接引用的程序集(System.Net.Http)升级到了由NuGet管理的版本。这删除了该项目中的直接参考,但是我们的Test项目仍然包含直接参考。升级两个项目以使用NuGet管理的程序集解决了该问题。



1

我发现,有时会安装nuget包(我猜是这样)。NETCore所需的组件或与已安装的框架冲突的其他项目。我的解决方案是打开项目(.csproj)文件并删除那些引用。例如,当通过一些最近安装的NuGet软件包包含Microsoft.Bcl时,往往会添加System.IO,System.Threading等。在我的项目中没有特定版本的理由,因此我删除了引用并建立了项目。希望能有所帮助。

您可以在项目文件中搜索“参考”并删除冲突。如果它们包含在System中,请摆脱它们,然后构建应该可以正常工作。这可能无法解决此问题的所有情况-我确保您知道对我有用的方法:)

我注释掉的示例:

<!-- <Reference Include="System.Runtime, Version=2.6.9.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> -->
  <!-- <HintPath>$(SolutionDir)packages\Microsoft.Bcl.1.1.9\lib\net40\System.Runtime.dll</HintPath> -->
  <!-- <Private>True</Private> -->
<!-- </Reference> -->


1

我遵循了此处几个答复的建议,以找出问题所在,但没有一个答案似乎可以解释如何解决。我的问题是,一个参考文献需要另一个参考文献的不同版本。因此,Newtonsoft的版本为6,但其他一些DLL需要4.5。然后,我将Newtonsoft升级为建议的其他答案之一,这使情况变得更糟。

所以我实际上 降级了我的Newtonsoft安装,警告消失了(VS 2017):

右键单击解决方案资源管理器中的“引用”,然后选择“管理NuGet软件包...”,在“已安装”选项卡下,找到Newtonsoft(或您遇到的任何冲突)。在右侧,“版本”旁边会出现一个下拉列表,您可以将其更改为较旧的版本版本。对我而言,这个下拉列表可用于降级并不明显。


1

您可以使用完整的诊断详细程度来运行Dotnet CLI,以帮助发现问题。

dotnet run --verbosity diagnostic >> full_build.log

构建完成后,您可以在日志文件(full_build.log)中搜索错误。例如,搜索“冲突”将使您直接解决问题。


0

我已经从管理NuGet Packagaes卸载了Microsoft ASP.NET MVC nuget.org,然后再次重新安装了它。重新安装时,它解决了与剃须刀版本有关的所有冲突。尝试一下 。


0

我将MSBuild的详细程度更改为Diagnostic。但是根据上面的答案找不到问题所在,因此我在app.config中有以下代码:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="XbimXplorer.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>

因此,我刚刚将第一个系统版本从4.0.0.0更改为12.0.0.0,并且我的项目正常工作。


0

根据其他答案,将输出日志记录级别设置为“详细”,并在其中搜索冲突,这将告诉您下一步的目标。

就我而言,它使我朝几个方向寻找参考源,但最后却发现问题出在我的可移植类库项目中,它的目标是错误的版本,并且正在拉自己的版本。版本中的引用,因此存在冲突。快速重新定位并解决了问题。



0

迁移到“软件包参考”后,我收到了此警告。在诊断输出中,存在这样的信息,即同一库本身引用了该库。这可能是新《软件包参考》中的一个错误。解决方案是启用AutoGenerateBindingRedirects并删除自定义绑定重定向。


0

VS 2017,MVC项目

我不知道为什么,但是对我来说,此问题的解决方案out是从控制器操作方法调用的模型方法签名中删除参数。那是非常奇怪的行为,但这是解决我的问题的方法。


-2

Update-Package通过程序包管理器控制台命令

这将修复MSB3277,它将重新安装所有附带的所有程序包和所有相关程序集,并将其安装到最高版本。也可以只更新特定的软件包。或在更新后降级(如果需要),这对我来说已经解决了几次。根据您拥有多少个nuget程序包,此过程可能需要几分钟。

有关官方文档的更多信息https://docs.microsoft.com/zh-cn/nuget/consume-packages/reinstalling-and-updating-packages


14
如果您不希望使用最新的软件包(生产代码通常是这种情况),则此建议可能会破坏您的一天。
Tony O'Hagan

1
建议中已指出了这一点,这对您来说可能是一个问题,是解决问题的安全简便方法,因此请不要对您的意见轻描淡写。
Aistis Taraskevicius

1
此解决方案对我不起作用。我已经拥有所有最新版本。
Zero3's

@ Zero3让您从顶级解决方案中运行它,而无需直接指定任何软件包,它通常可以正常工作,因为它会重新安装每个软件包并更新引用,这是导致
不匹配的

3
这真是可怕的建议。这是没有意见的,如果没有故意的话,更新软件包会破坏代码。
TheBatman '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.