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

Wat*_* v2 349 .net msbuild visual-studio-express visual-studio

当我清理并构建包含多个项目的解决方案时,输出窗口会报告构建成功.但是,当我查看错误列表窗口时,它会显示此警告:

发现无法解析的同一依赖程序集的不同版本之间的冲突.当日志详细程度设置为详细时,这些引用冲突将在构建日志中列出.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以及如何使警告消失?

Rub*_*ink 482

虽然其他回答说这个,但他们没有说明,所以我会......

在VS2013.2上,要实际触发引用信息的发送,您需要不读取消息,其中说:

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

这是不正确的(或者至少是某些版本的Visual Studio - 在最新的VS2015 Update 3或更高版本中似乎没问题).而是将其转换为诊断(从工具 - >选项 - >项目和解决方案 - >构建和运行,设置MSBuild项目构建输出详细程度),然后您将看到如下消息:

"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 转到构建输出窗口
  • 搜索" 被选中 "以查找下钻.

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

  • 要从菜单Tools-> Options中更改日志详细程度,请找到Project and Solutions-> Build and Run (97认同)
  • 日志级别详细似乎在VS内部工作(因此无需诊断).虽然MSBuild在VS内部表现不同,但这不是第一次.... (4认同)
  • 谢谢 - 多年来一直使用Visual Studio,从来没有遇到过需要在构建日志中深入挖掘这个问题的问题.不同的问题,但意识到我正在寻找的信息被发射到某个地方解决了我的问题. (3认同)
  • 在我的情况下,我有三个冲突,其中一个负责另外两个.我将我的"详细"构建日志复制到记事本,搜索"冲突",更新NuGet包以供我识别的参考,问题解决了. (3认同)
  • 这个答案实际上解释了如何解决它吗? (2认同)

Ily*_*kov 71

运行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提示添加了一个引用而不是Add Reference对话框,即使v4和v12都可供选择,它仍然没有版本.

<Reference Include="Microsoft.Build, Version=12.0.0.0, ..." />
<Reference Include="Microsoft.Build.Framework" />
Run Code Online (Sandbox Code Playgroud)

VS

<Reference Include="Microsoft.Build, Version=12.0.0.0, ..." />
<Reference Include="Microsoft.Build.Framework, Version=12.0.0.0, ..." />
Run Code Online (Sandbox Code Playgroud)

在具有/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]
Run Code Online (Sandbox Code Playgroud)

  • 我最终将该命令传递给日志文件,因此我可以更容易地查看它:`msbuild"Foo.sln"/ t:Rebuild/v:d> build.log` (10认同)
  • 到达终端的最佳方式:http://stackoverflow.com/a/22702405/268066 (2认同)
  • “构建日志”在哪里?我如何找到它? (2认同)
  • 这个答案展示了如何从 msbuild 获取更多详细信息,这是单声道用户关心的。所有其他答案都假设您正在使用 VS 并在 Windows 环境中运行。 (2认同)

Ale*_*tov 36

我只能通过比较显示的两条消息来支持Ruben的回答:

在此输入图像描述

和消息:

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

所以,鲁本是对的 - 这不是真的.没有任何冲突,只是缺少装配.当项目是ASP.NET应用程序时,这尤其无聊,因为视图是按需编译的,即在第一次显示之前.这是必须使组件可用的时候.(可以选择将视图与其余代码一起预编译,但这是另一个故事.)另一方面,如果将详细程度设置为Diagnostic,则会得到以下输出:

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画廊的信息.有关在此处预编译ASP.NET视图的更多信息.


sre*_*ree 20

改变visual studio中的构建详细程度将有助于指出正确的方向.按照以下步骤更改VS中的详细程度

  1. 转到VS中的"工具" - >"选项"菜单
  2. 打开项目和解决方案 - >构建和运行
  3. 更改MSBuild项目构建输出详细程度的值.选择一个距离Quiet,Minimal,Normal,DetailedDiagnostic

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


Cra*_*yro 16

然后如何让警告消失?

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

  • 最简单的检查方法:右键单击解决方案 - >`管理NuGet包以获得解决方案` - >在`Consolidate`下,您可以看到是否安装了相同软件包的不同版本 (21认同)
  • 这个,当它拒绝正确地重新安装软件包时重新启动Visual Studio的组合,为我解决了这个问题. (2认同)

Sha*_*gta 16

重申@elshev的评论之一右键单击解决方案 - >管理NuGet软件包以获得解决方案 - >在Consolidate下,您可以查看是否安装了相同软件包的不同版本.在那里更新包.冲突错误已解决.

  • 这并没有解决我的问题。我必须卸载 Newtonsoft.JSON 并通过 NuGet 重新安装。这更新了对其他包的依赖关系。 (2认同)

Ran*_*dle 8

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

看看Error List窗口.你会看到关于绑定冲突的长期警告.双击它,它将自动重新创建<runtime><assemblyBinding>具有正确映射的块.


Jos*_*cia 6

dotnet CLI问题6583所述,问题应该通过dotnet nuget locals --clear all命令解决.


小智 5

我可以使用 nugget 包解决在 Web 项目中安装 Newtonsoft Json 的问题