发现不能解决的相同相关程序集的不同版本之间的冲突

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

发现不能解决的相同相关程序集的不同版本之间的冲突。 当日志详细程度设置为详细时,这些参考冲突在构build日志中列出。 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,然后怎么让警告消失呢?

而其他回答说这个,他们没有说清楚,所以我会….

在VS2013.2上,为了实际触发引用信息的发布,您不需要阅读以下消息:

C:\ Program Files文件(x86)\ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets(1697,5):警告MSB3277:在不能parsing的相同相关程序集的不同版本之间发现冲突。 当日志详细程度设置为详细时,这些参考冲突在构build日志中列出。

这是不正确的(或至less是一些版本的Visual Studio – 它似乎是最新的VS2015更新3或更高版本)。 相反,将其转换为诊断 (从工具 – >选项 – >项目和解决scheme – >build立和运行 ,设置MSBuild项目build立输出详细 ),届时你会看到消息,如:

“Newtonsoft.Json,Version = 6.0.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed”和“Newtonsoft.Json,Version = 6.0.5.17707,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed”之间有冲突。

  • “Newtonsoft.Json,Version = 6.0.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed”被选中是因为它是主要的,“Newtonsoft.Json,Version = 6.0.5.17707,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed”不是。

然后

  • Ctrl-Alt-O转到生成输出窗口
  • search“ 被选中 ”来查找向下钻取。

…是的,对于那些查看[诊断]信息细节的人来说,这个无知是有新闻的, 因为所有的6.x版本都有一个在内部的Assembly版本6.0.0.0 ,也就是只有SemVer主要组成部分进入大会版 🙂

运行msbuild Foo.sln /t:Rebuild /v:diag (从C:\Program Files (x86)\MSBuild\12.0\bin )从命令行构build你的解决scheme并获得更多的细节,然后find.csproj. 它会logging警告并检查其引用和其他项目的引用,这些项目使用相同的常见程序集,版本不同。

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

编辑:几个澄清,因为我刚刚得到一个自己。 在我的情况下,警告是由于我使用Resharper提示添加了一个引用,而不是添加引用对话框,尽pipev4和v12都可以从中进行select,但它没有使用。

 <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, ..." /> 

在具有/v:diag详细信息的MSBuild日志中,它看起来如下所示。 给出两个参考相冲突的细节:

  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] 

我只能比较两个显示的信息来支持Ruben的答案。

在这里输入图像说明

和消息:

C:\ Program Files文件(x86)\ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets(1697,5):警告MSB3277:在不能parsing的相同相关程序集的不同版本之间发现冲突。 当日志详细程度设置为详细时,这些引用冲突在构build日志中列出。

所以,鲁本的权利 – 这是不正确的。 没有任何冲突,只是缺less一个集会。 当项目是一个ASP.NET应用程序时,这是非常无聊的,因为视图是按需编译的,也就是在第一次显示之前。 这是当有必要有可用的组件。 (有一个选项可以与其他代码一起预编译视图,但这是另外一回事 。)另一方面,如果将详细信息设置为Diagnostic,则会得到以下输出:

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

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

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

更多关于NuGet画廊在这里 。 更多关于预编译ASP.NET视图的信息

那我怎么才能让警告消失呢?

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

重申@elshev的评论之一右键点击解决scheme – >pipe理解决scheme的NuGet包 – >在Consolidate下,你可以看到是否安装了同一个包的不同版本。 在那里更新软件包。 冲突错误已解决。

正如在dotnet CLI问题6583中所述,应该用dotnet nuget locals --clear all来解决问题 – dotnet nuget locals --clear all命令。

我可以解决这个安装牛顿软件JSON在Web项目与金块包

我发现,有时,Nuget软件包将安装(我猜测是).NET核心需要的组件或与已经安装的框架冲突的其他项目。 我的解决scheme是打开项目(.csproj)文件并删除这些引用。 例如,当通过一些最近安装的NuGet包装包含Microsoft.Bcl时,System.IO,System.Threading等等往往会被添加。 在我的项目中没有特定版本的原因,所以我删除了引用和项目构build。 希望有所帮助。

您可以search您的项目文件的“参考”,并消除冲突。 如果它们被包含在系统中,那就去掉它们,然后构build就可以运行。 这可能不会回答这个问题的所有情况 – 我确定你知道什么对我有用:)

我注释的例子:

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

如果你对软件包做了任何修改 – 重新打开sln。 这对我有用!

我已经从pipe理NuGet Packagaes卸载了Microsoft ASP.NET MVC nuget.org,并重新安装了它。 在重新安装时,解决了所有与razor版本相关的冲突。 尝试一下 。

我改变了MSBuild的详细程度Diagnostic.but找不到问题的地方,所以根据上面的答案我在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,我的项目工作。

根据其他答案,将输出日志logging级别设置为详细,并在那里search冲突,这将告诉你在哪里看下一步。

在我的情况下,它在几个方向上给我发送引用的来源,但最终发现问题是我的便携式类库项目之一,它是针对错误的版本,并拉着自己的版本的引用,因此冲突。 一个快速的重新目标和问题解决了。

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

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

通过程序包pipe理器控制台运行Update-Package命令

这将修复MSB3277,它是什么它重新安装所有的软件包和所有相关的组件,以最高的版本可能 。 也可以更新只是特定的软件包。 或更新后降级,如果想要的话,这个固定的问题对我来说几次了。 取决于你有多less个nuget包,这个过程可能需要几分钟的时间。

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

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

 1. Go to Tools->Options menu in VS 2. Open Projects and Solutions->Build and Run 3. Change the value of the MSBuild project build output verbosity. Pick one from Quiet, Minimal, Normal, Detailed and Diagnostic 

检查VS中的输出窗口(cntl + alt + o)以了解构build中的更改