ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

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

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

我向 MS Connect 提交了在消息 connect.microsoft.com/VisualStudio/feedback/details/2619450 中包含 DLL 名称的建议
我的情况是因为项目 A 中的 <PrivateAssets>。它将其他依赖项之一(我们称之为包 X)的版本提升到更高版本。解决方案还有项目 B,其中项目 A 作为参考。它看到包 X“低版本”(并选择它作为“主要”版本),因为私有资产请求的更高版本是......很好私有 - 不可见。现在是时候构建了:PackageX.dll“低版本”被复制到输出,程序集 projectA.dll 被复制到输出... 不用等待! projectA.dll 需要 projekt X“更高版本” - >无法解决的 DLL-HELL ->构建失败。

C
Community

eta:您应该阅读 killer article on this stuff by SO's own @Nick Craver

虽然其他回复都这么说,但他们并没有明确表示,所以我会......

在 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 转到构建输出窗口

搜索“被选中”以查找明细。

...是的,对于那些查看 [诊断] 消息细节的人来说,对于这个无知的人来说,there's a convention in town whereby all 6.x versions are, internally Assembly Version 6.0.0.0, i.e. only the SemVer Major component goes into the Assembly Version 是新闻 :)


谢谢 - 多年来一直使用 Visual Studio,从来没有遇到需要在构建日志中深入挖掘的问题。不同的问题,但意识到我正在寻找的信息正在某个地方发出解决了我的问题。
详细的日志级别似乎在 VS 中工作(因此不需要诊断)。虽然 MSBuild 在 VS 中的行为有所不同,但这并不是第一次......
要从菜单 Tools->Options 更改日志详细程度,然后找到 Project and Solutions->Build and Run
就我而言,我遇到了三个冲突,其中一个负责另外两个。我将我的“详细”构建日志复制到记事本,搜索“冲突”,更新 NuGet 包以获取我识别的参考,问题就解决了。
这是我的确切问题,归根结底是因为 Newtonsoft.Json。但是为什么有2个版本,我需要担心这个错误吗?我认为这个库是用 NuGet 包添加的。
R
Ruben Bartelink

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

在具有 /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]

我最终将该命令通过管道传输到日志文件,这样我可以更轻松地查看它:msbuild "Foo.sln" /t:Rebuild /v:d > build.log
为此到达终端的最佳方式:stackoverflow.com/a/22702405/268066
@CrazyPyro msbuild 有一个“内置”管道——/l:FileLogger,Microsoft.Build.Engine;logfile=build.log——注意 switches for loggers explanation here
“构建日志”在哪里?我如何找到它?
这个答案显示了如何从 msbuild 获取更多详细信息,这是单声道用户关心的。所有其他答案都假设您正在使用 VS 并在 Windows 环境中运行。
A
Alexander Christov

我只能通过显示的两条消息之间的比较来支持鲁本的进一步回答:

https://i.stack.imgur.com/61xPl.png

和消息:

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

所以,鲁本是对的——这不是真的。没有任何冲突,只是缺少一个程序集。当项目是 ASP.NET 应用程序时,这尤其无聊,因为视图是按需编译的,也就是说,就在第一次显示之前。这时就需要有可用的程序集。 (有一个选项可以将视图与其余代码一起预编译,但这是 another story。)另一方面,如果将详细程度设置为 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”。检查以确保该程序集存在于磁盘上。如果您的代码需要此引用,您可能会遇到编译错误。

因此,您需要做的就是:

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

有关 NuGet 库 here 的更多信息。有关预编译 ASP.NET 视图的更多信息 here


在 VS 2017 中,当我将“MSBuild 项目构建输出详细程度”(不是日志文件)设置为详细(不是诊断)时,我的输出窗口中出现“无法找到程序集”错误。
@ALEXintlsos:显然这个功能已经改变了;无论它在哪里,您仍然会遇到错误 - 按照说明摆脱它。
R
Rosdi Kasim

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

转到 VS Open Projects and Solutions->Build and Run 中的 Tools->Options 菜单更改 MSBuild 项目构建输出详细程度的值。从安静、最小、正常、详细和诊断中选择一个

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


S
Shaswat Rungta

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


这并没有为我解决。我不得不卸载 Newtonsoft.JSON 并通过 NuGet 重新安装。这更新了对其他包的依赖关系。
当我使用 Resharper 之类的工具时,这也发生在我身上,它会自动添加缺少的 DLL 引用。 “始终使用 nuget 添加”在这里可能是一个很好的建议。
它对我不起作用,因为要卸载一个包,它会尝试构建一个由于包冲突而无法发生的构建。所以我什至无法重新安装软件包:(
C
Community

然后我该如何让警告消失?

您可能必须 reinstall 或升级您的 NuGet 包来解决此问题。


这与拒绝正确重新安装软件包时重新启动 Visual Studio 相结合,为我解决了这个问题。
最简单的检查方法:右键单击解决方案-> Manage NuGet packages for solution ->在 Consolidate 下,您可以查看是否安装了同一软件包的不同版本
R
RandomHandle

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

查看 Error List 窗口。你会看到一个关于绑定冲突的看起来很长的警告。双击它,它会自动重新创建具有正确映射的 <runtime><assemblyBinding> 块。


N
Nathan Tuggy

dotnet CLI issue 6583 中所述,应使用 dotnet nuget locals --clear all 命令解决该问题。


这对我不起作用;运行命令后情况相同。
@Zimano 这确实对我有用,但只有在退出 Visual Studio 并重新启动之后!然后重建项目解决了这个问题。
C
Carolina

我可以用金块包解决这个在 Web 项目中安装 Newtonsoft Json 的问题


j
joelmdev

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


N
Naumaan Shaikh

如果您对包进行了任何更改 - 重新打开 sln.这对我有用!


P
Prince Owen

您可以运行具有完整诊断详细信息的 Dotnet CLI 来帮助查找问题。

dotnet run --verbosity diagnostic >> full_build.log

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


A
Auri Rahimzadeh

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

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

我注释掉的例子:


T
Tom Makin

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


A
Andrew

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

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

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


u
user8128167

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

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

j
jitendra r

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


P
Pantelitsa Mavrovounioti

我将 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,我的项目就成功了。


c
car1bo

根据其他答案,将输出日志记录级别设置为详细并在那里搜索冲突,这将告诉您接下来要看的地方。

就我而言,它让我朝几个方向寻找引用的来源,但最终发现问题出在我的可移植类库项目之一,它针对的是错误的版本并且正在拉出自己的版本版本的引用,因此冲突。快速重新定位,问题就解决了。


r
raV720

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


J
Jonathan Applebaum

VS 2017,MVC 项目

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


T
Tayron Ovares

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