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

时间:2014-07-16 04:08:09

标签: .net visual-studio msbuild visual-studio-2013 visual-studio-express

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

  

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

23 个答案:

答案 0 :(得分:454)

虽然其他回复说明了这一点,但他们并没有明确说明,所以我会......

在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:)

答案 1 :(得分:69)

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

编辑:您还可以直接在VS2013中设置构建详细程度。转到Tools>然后转到Options并将MSBuild详细程度设置为Projects and Solutions

编辑:很少澄清,因为我自己只有一个。在我的情况下,警告是由于我使用Resharper提示添加了一个引用,而不是Add Reference对话框,即使v4和v12都可以选择,它也没有版本。

Diagnostic

VS

<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, ..." /> 详细程度的MSBuild日志中,它看起来如下所示。提供两个引用冲突的细节: -

/v:diag

答案 2 :(得分:34)

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

enter image description here

和消息:

  

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:无法解析此引用。 无法找到程序集&#34; System.Web.Razor,Version = 3.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35,processorArchitecture = MSIL&#34;。检查以确保程序集存在在磁盘上。如果您的代码需要此引用,则可能会出现编译错误。

因此,您需要做的只是:

  1. 手动添加对程序集的引用(可能是在磁盘上找到它) GAC,并将其添加为&#34; direct&#34;参考),或
  2. 使用NuGet包(如果在图库中发布)下载并引用其中包含的程序集。
  3. 有关NuGet gallery here的更多信息。 有关预编译ASP.NET视图的更多信息here

答案 3 :(得分:15)

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

答案 4 :(得分:15)

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

  1. 转到VS中的工具 - >选项菜单
  2. 打开项目和解决方案 - &gt;构建并运行
  3. 更改MSBuild项目构建输出详细程度的值。挑 一个来自QuietMinimalNormalDetailedDiagnostic
  4. 检查VS中的输出窗口( Ctrl + Alt + O )以查看构建日志中的更改。

答案 5 :(得分:14)

  

然后如何让警告消失?

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

答案 6 :(得分:6)

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

查看Error List窗口。您将看到关于绑定冲突的长篇警告。双击它,它将自动使用正确的映射重新创建<runtime><assemblyBinding>块。

答案 7 :(得分:6)

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

答案 8 :(得分:3)

我可以使用nugget包

解决这个在Web项目中安装Newtonsoft Json的问题

答案 9 :(得分:3)

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

答案 10 :(得分:2)

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

答案 11 :(得分:2)

您可以使用完整的诊断详细程度来运行Dotnet CLI,以帮助发现问题。

dotnet run --verbosity diagnostic >> full_build.log

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

答案 12 :(得分:1)

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

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

我注释掉的例子:

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

答案 13 :(得分:1)

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

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

答案 14 :(得分:0)

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

答案 15 :(得分:0)

根据其他答案,将输出日志记录级别设置为详细信息并在那里搜索冲突,这将告诉您下一步的位置。

在我的情况下,它向我发送了几个方向,寻找引用的来源,但最终结果发现问题是我的便携式类库项目之一,它的目标是错误的版本,是拉动自己的参考版本,因此冲突。一个快速的重新目标,问题就解决了。

答案 16 :(得分:0)

我将MSBuild的详细程度更改为Diagnostic。但是根据上面的答案我无法找到问题的位置,我在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>

所以我刚刚将第一个System,Version从4.0.0.0更改为12.0.0.0,我的项目工作正常。

答案 17 :(得分:0)

迁移到“软件包参考”后,我收到了此警告。在诊断输出中,存在这样的信息,即同一库本身引用了该库。这可能是新《软件包参考》中的一个错误。解决方案是启用AutoGenerateBindingRedirects并删除自定义绑定重定向。

答案 18 :(得分:0)

我听了这里几个回答的建议,以找出问题所在,但没有一个答案似乎可以解释如何解决。我的问题是,一个参考文献需要另一个参考文献的不同版本。因此,Newtonsoft的版本为6,但其他一些DLL需要4.5。然后,我将Newtonsoft升级为建议的其他答案之一,这使情况变得更糟。

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

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

答案 19 :(得分:0)

VS 2017,MVC项目

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

答案 20 :(得分:0)

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

答案 21 :(得分:0)

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

答案 22 :(得分:-1)

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

这将修复MSB3277,它将所有软件包及其随附的所有相关程序集重新安装到最高版本。也可以只更新特定的包。或者如果需要更新后降级,这个固定的问题对我来说几次就出现了。根据您拥有的nuget包的数量,此过程可能需要几分钟。

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