发现同一依赖程序集的不同版本之间存在无法解决的冲突

当我清理并构建具有多个项目的解决方案时,输出窗口将报告构建成功。然而,当我查看错误列表窗口时,它向我显示了这样的警告:

发现同一依赖程序集的不同版本之间存在无法解决的冲突。当日志详细信息设置为detailed时,这些引用冲突将在生成日志中列出。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,然后我如何使警告消失?

314613 次浏览

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

编辑:你也可以在VS2013中直接设置构建细节。转到Tools > Options菜单,然后转到Projects and Solutions并将MSBuild verbose设置为Diagnostic

编辑:有些澄清,因为我自己也有一个。在我的例子中,警告是由于我使用Resharper提示符添加引用,而不是添加引用对话框,这使得它无版本,即使v4和v12都可以选择。

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

vs

<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]

我该如何让警告消失呢?

你可能不得不重新安装或升级你的NuGet包来解决这个问题。

eta:有一个这是SO自己的@Nick Craver写的一篇杀手级文章,你应该读


虽然其他的回答是这样说的,但他们并没有明确表示,所以我将....

在VS2013.2上,要真正触发引用信息的发射,您不需要阅读消息,它说:

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

这是不正确的(或者至少在某些版本的Visual Studio中是这样的——在VS2015更新3或更高的版本中似乎是可以的)。相反,将其转换为诊断(从工具->选项->项目和解决方案->构建和运行,设置MSBuild项目构建输出的冗长性),此时你将看到如下消息:

“牛顿软”和“牛顿软”之间有冲突。Json,版本=6.0.0.0,文化=中性,PublicKeyToken=30ad4fe6b2a6aeed"和“Newtonsoft。Json,版本=6.0.5.17707,文化=中性,PublicKeyToken=30ad4fe6b2a6aeed";

  • “Newtonsoft。Json,版本=6.0.0.0,文化=中性,PublicKeyToken=30ad4fe6b2a6aeed"选择它是因为它是初级的和“牛顿软”。Json,版本=6.0.5.17707,文化=中性,PublicKeyToken=30ad4fe6b2a6aeed"不是。

然后

  • Ctrl-Alt-O转到构建输出窗口
  • 搜索“;被选"找到下钻。

...是的,对于那些查看[诊断]消息的细节的人来说,城里有一个约定,所有的__ABC0版本都在汇编版本6.0.0.0内部,即只有SemVer Major组件进入汇编版本:)对这个无知的人来说是新闻。

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

我只能通过对比所显示的两条消息来进一步支持Ruben的回答:

enter image description here

信息是:

C:\Program Files (x86)\MSBuild\12.0\bin\ Microsoft.Common.CurrentVersion.targets(1697,5):警告MSB3277:发现同一依赖程序集的不同版本之间存在无法解决的冲突。当日志细节设置为详细的时,这些引用冲突将在构建日志中列出。

所以,鲁本是对的——这是不对的。没有任何冲突,只是缺少了一个集合。当项目是一个ASP时,这尤其令人厌烦。NET应用程序,因为视图是对需求编译的,也就是说,在第一次显示之前。这时就需要有可用的程序集。(有一个选项可以将视图与其余代码一起预编译,但这是另一个故事。)另一方面,如果你将verbose设置为诊断,你会得到以下输出:

C:\Program Files (x86)\MSBuild\12.0\bin\ Microsoft.Common.CurrentVersion.targets(1697,5):警告MSB3245:无法解析此引用。无法定位程序集“System.Web”。Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"。检查确保程序集存在于磁盘上。如果您的代码需要此引用,则可能会出现编译错误。

因此,你所需要做的就是:

  1. 手动添加对程序集的引用(可能将其定位到磁盘上) GAC,并将其作为“直接”引用),或
  2. 使用NuGet包(如果在图库中发布)下载它并引用其中包含的程序集。
更多关于NuGet gallery 在这里。 更多关于预编译ASP。. NET视图在这里.

. NET

我将MSBuild详细信息更改为诊断。但是找不到问题在哪里,所以根据上面的答案,我在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,我的项目工作了。

我可以解决这个问题,在web项目中安装Newtonsoft Json

重申@elshev的评论之一 右键单击解决方案->管理解决方案->的NuGet包在巩固下,你可以看到是否有不同版本的相同的包被安装。在那里更新包。

.输出说明

根据其他答案,将输出日志记录级别设置为detailed并在那里搜索冲突,这将告诉您下一步要查看的位置。

在我的例子中,它让我在几个方向上寻找引用的源,但最后发现问题出在我的一个可移植类库项目上,它瞄准了错误的版本,并引入了自己的引用版本,因此产生了冲突。一个快速的重新定位,问题就解决了。

我发现,有时候,nuget包会安装(我猜是). net Core所需的组件或其他与已经安装的框架冲突的项目。我的解决方案是打开项目(.csproj)文件并删除这些引用。例如,System。IO、系统。线程等,往往是微软添加时。Bcl包括通过一些最近安装的NuGet包。在我的项目中不需要特定的版本,所以我删除了引用和项目构建。希望这能有所帮助。

您可以在项目文件中搜索“参考”并删除冲突。如果它们包含在系统中,那么去掉它们,构建应该可以工作。这可能不能回答这个问题的所有情况-我确保你知道什么对我有用:)

我注释掉的例子:

<!-- <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> -->

在将包从nuget切换到本地引用dll后,我遇到了这个问题。问题是旧的app.config运行时绑定的东西。

如果您对包做了任何更改,请重新打开sln。这对我很管用!

正如. net命令行问题6583中所述,这个问题应该用dotnet nuget locals --clear all命令来解决。

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

在visual studio中改变构建的冗长将有助于指向正确的方向。按照以下步骤更改VS中的详细信息

  1. 进入工具->选项菜单在VS
  2. 开放项目和解决方案->构建和运行
  3. 修改MSBuild项目构建输出详细信息的值。选择 QuietMinimalNormalDetailedDiagnostic

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

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

查看Error List窗口。您将看到一个关于绑定冲突的非常长的警告。双击它,它将自动用正确的映射重新创建<runtime><assemblyBinding>块。

在迁移到Package Reference之后,我收到了这个警告。在诊断输出中,有同一库本身引用了该库的信息。这可能是一个新的包引用的错误。解决方案是启用AutoGenerateBindingRedirects并删除自定义绑定重定向。

我遵循了这里的几个回复的建议来找出问题所在,但似乎没有一个答案能解释如何修复它。我的问题是,一个参考文献需要另一个参考文献的不同版本。因此,Newtonsoft的版本是6,但其他一些DLL想要4.5。然后我按照其他答案的建议升级了Newtonsoft,这让事情变得更糟。

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

右键单击解决方案资源管理器中的引用,选择管理NuGet包… 在“Installed”选项卡下,找到Newtonsoft(或任何你的冲突) 在右侧,“版本”旁边会出现一个下拉框,您可以将其更改为旧版本。对我来说,这个下拉菜单并不明显,可以用来降级

VS 2017, MVC项目

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

您可以运行Dotnet CLI进行详细的诊断,以帮助查找问题。

dotnet run --verbosity diagnostic >> full_build.log

构建完成后,您可以通过日志文件(full_build.log)搜索错误。例如,搜索“一个冲突”,应该会把你直接带到问题所在。

请注意,我通过在csproj文件中将AutoGenerateBindingRedirects放在TargetFramework之后来解决这个问题:

<TargetFramework>net462</TargetFramework>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>

我已经安装了Newtonsoft。Json v10.0.0.3和Newtonsoft。Json v11.X.X。X在不同的项目从nuget.org从管理NuGet Packagaes和再次重新安装它(相同的版本)。重新安装时解决了所有与剃刀版本相关的冲突。为我工作吧!