发现同一依赖程序集的不同版本之间存在无法解决的冲突
Posted
技术标签:
【中文标题】发现同一依赖程序集的不同版本之间存在无法解决的冲突【英文标题】:Found conflicts between different versions of the same dependent assembly that could not be resolved 【发布时间】:2014-09-06 11:11:18 【问题描述】:当我清理并构建包含多个项目的解决方案时,输出窗口会报告构建成功。但是,当我查看 错误列表窗口 时,它会显示以下警告:
。当日志详细程度设置为详细时,这些引用冲突会列在构建日志中。 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 for Web。
我如何找出问题所在以及哪个 DLL 以及如何使警告消失?
【问题讨论】:
另见...***.com/questions/1871073/… 我向 MS Connect 提交了在消息 connect.microsoft.com/VisualStudio/feedback/details/2619450 中包含 DLL 名称的建议 【参考方案1】:我已经在来自 nuget.org 的不同项目中安装了 Newtonsoft.Json v10.0.0.3 和 Newtonsoft.Json v11.X.X.X,并再次重新安装了它(相同版本)。重新安装时,它解决了与剃刀版本相关的所有冲突。为我工作!
【讨论】:
【参考方案2】:请注意,我通过将AutoGenerateBindingRedirects
放在TargetFramework
之后的csproj
文件中解决了这个问题:
<TargetFramework>net462</TargetFramework>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
【讨论】:
【参考方案3】:您可以运行具有完整诊断详细信息的 Dotnet CLI 来帮助查找问题。
dotnet run --verbosity diagnostic >> full_build.log
构建完成后,您可以在日志文件 (full_build.log) 中搜索错误。例如,搜索“冲突”应该可以直接解决问题。
【讨论】:
【参考方案4】: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 或更高版本上似乎没问题)。而是将其改为Diagnostic(从Tools->Options->Project and Solutions->Build and Run,设置MSBuild project build output verbosity) ,然后您会看到如下消息:
“Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”和“Newtonsoft.Json, Version=6.0.5.17707, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”之间存在冲突。
“Newtonsoft.Json,版本=6.0.0.0,Culture=neutral,PublicKeyToken=30ad4fe6b2a6aeed”被选中,因为它是主要的并且“Newtonsoft.Json,版本=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 包添加的。【参考方案5】:VS 2017,MVC 项目
我不知道为什么,但对我来说,这个问题的解决方案是从控制器操作方法调用的模型方法签名中删除 out
参数。 这是非常奇怪的行为,但这是我的问题的解决方案。
【讨论】:
【参考方案6】:我按照这里的几个回复的建议来找出问题所在,但似乎没有一个答案能解释如何解决它。我的问题是一个参考需要第二个参考的不同版本。所以 Newtonsoft 的版本是 6,但其他一些 DLL 想要 4.5。然后我按照建议的其他答案之一升级了 Newtonsoft,这让事情变得更糟。
所以我实际上降级了我的 Newtonsoft 安装并且警告消失了(VS 2017):
在解决方案资源管理器中右键单击引用并选择管理 NuGet 包... 在“已安装”选项卡下,找到 Newtonsoft(或任何您的冲突) 在右侧,“版本”旁边会出现一个下拉菜单,您可以将其更改为旧版本。对我来说,这个下拉菜单可用于降级并不明显。
【讨论】:
【参考方案7】:在 Visual Studio 中更改构建详细程度将有助于指明正确的方向。按照以下步骤更改 VS 中的详细程度
-
转到工具->VS 中的选项菜单
打开项目和解决方案->构建并运行
更改 MSBuild 项目构建输出详细程度的值。挑选
来自
Quiet
、Minimal
、Normal
、Detailed
和 Diagnostic
的一个
在 VS 中查看输出窗口(Ctrl+Alt+O) 以查看构建日志中的变化。
【讨论】:
【参考方案8】:我在迁移到包参考后收到此警告。在诊断输出中,有信息表明库被同一个库本身引用。这可能是新包参考的错误。解决方案是启用 AutoGenerateBindingRedirects 并删除自定义绑定重定向。
【讨论】:
【参考方案9】:我正在使用 Visual Studio 2017,当我更新一些 Nuget 包时遇到了这个问题。对我有用的是打开我的web.config
文件并找到<runtime><assemblyBinding>
节点并将其删除。保存web.config
并重建项目。
查看Error List
窗口。你会看到一个关于绑定冲突的看起来很长的警告。双击它,它将自动重新创建具有正确映射的<runtime><assemblyBinding>
块。
【讨论】:
【参考方案10】:显然有很多不同的原因,因此有很多解决这个问题的方法。为了让我参与其中,我们将以前在我们的 Web 项目中直接引用的程序集 (System.Net.Http) 升级为由 NuGet 管理的版本。这删除了该项目中的直接引用,但我们的测试项目仍然包含直接引用。升级这两个项目以使用 NuGet 管理的程序集解决了该问题。
【讨论】:
【参考方案11】:如dotnet CLI issue 6583 中所述,应使用dotnet nuget locals --clear all
命令解决该问题。
【讨论】:
这对我不起作用;运行命令后情况相同。 @Zimano 这确实对我有用,但只有在退出 Visual Studio 并重新启动之后!然后重建项目解决了这个问题。【参考方案12】:如果您对包进行了任何更改 - 重新打开 sln.这对我有用!
【讨论】:
【参考方案13】:在将包从 nuget 切换到本地引用的 dll 后,我遇到了这个问题。问题是 app.config
中的旧运行时绑定内容。
【讨论】:
【参考方案14】:我发现,有时,nuget 包会安装(我猜是).NET Core 所需的组件或其他与已安装框架冲突的项目。我的解决方案是打开项目(.csproj)文件并删除这些引用。例如,System.IO、System.Threading 等往往会在通过一些最近安装的 NuGet 包包含 Microsoft.Bcl 时添加。我的项目中没有特定版本的原因,因此我删除了引用和项目构建。希望对您有所帮助。
您可以在您的项目文件中搜索“参考”并消除冲突。如果它们包含在 System 中,请删除它们,构建应该可以工作。这可能无法回答此问题的所有情况 - 我确保您知道什么对我有用:)
我注释掉的例子:
<!-- <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> -->
【讨论】:
【参考方案15】:根据其他答案,将输出日志记录级别设置为详细并在那里搜索冲突,这将告诉您下一步该往哪里看。
就我而言,它让我在几个方向寻找引用的来源,但最终发现问题出在我的可移植类库项目之一,它针对的是错误的版本并且是将其自己的引用版本拉入其中,因此会发生冲突。快速重新定位,问题就解决了。
【讨论】:
【参考方案16】:重申来自@elshev 的 cmets 之一 右键单击解决方案 -> 管理解决方案的 NuGet 包 -> 在合并下,您可以查看是否安装了同一包的不同版本。在那里更新软件包。冲突错误已解决。
【讨论】:
这并没有解决我的问题。我不得不卸载 Newtonsoft.JSON 并通过 NuGet 重新安装。这更新了对其他包的依赖。 这也发生在我使用 Resharper 之类的工具时,它会自动添加缺少的 DLL 引用。 “始终使用 nuget 添加”在这里可能是一个很好的建议。 它对我不起作用,因为卸载一个包它会尝试构建一个由于包冲突而无法发生的构建。所以我什至无法重新安装软件包:(【参考方案17】:我只能通过显示的两条消息之间的比较来支持鲁本的进一步回答:
和消息:
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:显然这个功能已经改变了;无论它在哪里,你仍然得到错误 - 按照说明摆脱它。【参考方案18】:我可以通过 nugget 包在 web 项目中安装 Newtonsoft Json 来解决这个问题
【讨论】:
【参考方案19】:我将 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,我的项目就成功了。
【讨论】:
【参考方案20】:我已经从管理 NuGet Packagaes 中卸载了 Microsoft ASP.NET MVC nuget.org,并再次重新安装了它。重新安装时,它解决了与剃刀版本相关的所有冲突。试试看。
【讨论】:
【参考方案21】:运行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
到达终端的最佳方式:***.com/a/22702405/268066
@CrazyPyro msbuild 有一个“内置”管道——/l:FileLogger,Microsoft.Build.Engine;logfile=build.log
——注意switches for loggers explanation here
“构建日志”在哪里?我如何找到它?
这个答案展示了如何从 msbuild 获取更多细节,这是单声道用户关心的。所有其他答案都假设您正在使用 VS 并在 Windows 环境中运行。【参考方案22】:
然后我该如何让警告消失?
您可能需要reinstall 或升级您的 NuGet 包来解决此问题。
【讨论】:
这与拒绝正确重新安装软件包时重新启动 Visual Studio 相结合,为我解决了这个问题。 最简单的检查方法:右键解决方案->Manage NuGet packages for solution
->Consolidate
下可以查看是否安装了同一个包的不同版本以上是关于发现同一依赖程序集的不同版本之间存在无法解决的冲突的主要内容,如果未能解决你的问题,请参考以下文章
无法解决“Microsoft.SharePoint.Security, Version=15.0.0.0,”与“Microsoft.SharePoint.Security, Version=14.0.