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

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

当我双击此消息时,它将打开C:\Program Files (x86)\MSBuild\12.0\bin\ Microsoft.Common.CurrentVersion。目标文件,但我不明白任何东西在它。

我正在使用Visual Studio Express 2013的Web。

我如何找出什么是错误的,与哪个DLL,然后我如何使警告消失?


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

编辑:你也可以在VS2013中直接设置构建细节。转到工具>选项菜单,然后转到项目和解决方案,将MSBuild verbose设置为诊断。

编辑:有些澄清,因为我自己也有一个。在我的例子中,警告是由于我使用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, ..." />

在使用/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]

我该如何让警告消失呢?

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


eta: SO自己的@Nick Craver写了一篇关于这方面的杀手级文章,你应该读一下


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

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

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

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

“牛顿软”和“牛顿软”之间存在冲突。Json,版本=6.0.0.0,文化=中性,PublicKeyToken=30ad4fe6b2a6aeed"和"牛顿软。Json,版本=6.0.5.17707,文化=中性,PublicKeyToken=30ad4fe6b2a6aeed"。 “Newtonsoft。Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”被选中是因为它是primary和“Newtonsoft. Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”。Json,版本=6.0.5.17707,文化=中性,PublicKeyToken=30ad4fe6b2a6aeed"不是。

Then

按Ctrl-Alt-O进入构建输出窗口 搜索“was chosen”可以找到下钻。

...是的,对于那些看[诊断]信息细节的人来说,这对这个无知的人来说是新闻,在城里有一个公约,所有6。x版本在内部是Assembly Version 6.0.0.0,即只有SemVer Major组件进入Assembly Version:)


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


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

信息是:

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

So, Ruben's right—this is just not true. There are no conflicts whatsoever, just a missing assembly. This is especially boring when the project is an ASP.NET application, since the views are compiled on demand, that is, just before displayed for the first time. This is when it becomes necessary to have the assembly available. (There's an option to pre-compile the views together with the rest of the code, but this is another story.) On the other hand, if you set the verbosity to Diagnostic you get the following output:

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"。检查以确保程序集存在于磁盘上。如果您的代码需要此引用,则可能会出现编译错误。

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

手动向程序集添加引用(可能将其定位到磁盘上) GAC,并将其添加为“直接”参考),或 使用NuGet包(如果在图库中发布)下载它并引用其中包含的程序集。

更多关于NuGet画廊在这里。 更多关于预编译ASP。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并在那里搜索冲突,这将告诉您下一步要查看的位置。

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


I found that, sometimes, nuget packages will install (what I'm guessing are) .NET Core required components or other items that conflict with the already-installed framework. My solution there was to open the project (.csproj) file and remove those references. For example, System.IO, System.Threading and such, tend to be added when Microsoft.Bcl is included via some recently installed NuGet package. There's no reason for specific versions of those in my projects, so I remove the references and the project builds. Hope that helps.

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

我注释掉的例子:

< !<参考Include=“系统。”Runtime,版本=2.6.9.0,Culture=neutral, PublicKeyToken= b03f5f7f3a, processorArchitecture=MSIL"> -> < !- <HintPath>$(解决方案)packages\Microsoft.Bcl.1.1.9\lib\net40\系统. runtpath > < !<Private>True</Private> -> < !</参考> ->


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


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


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


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


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

进入工具->选项菜单在VS 开放项目和解决方案->构建和运行 更改MSBuild项目构建输出详细信息的值。选择 分别是安静、最小、正常、详细和诊断

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


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

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


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


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

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

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


VS 2017, MVC项目

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


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

Dotnet运行——verbose diagnostic >> full_build.log

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


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

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

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