在新的ASP.NET MVC 5项目中更新NuGet包引用后,如何解决与JSON.NET的程序集版本冲突?


89

我在VS 2013(更新1)中创建了一个新的ASP.NET MVC 5 Web项目,然后更新了所有NuGet软件包。构建项目时,收到以下警告:

警告MSB3243:无法解决“ Newtonsoft.Json,版本= 6.0.0.0,文化=中性,PublicKeyToken = 30ad4fe6b2a6aeed”和“ Newtonsoft.Json,版本= 4.5.0.0,文化=中性,PublicKeyToken = 30ad4fe6b2a6aeed”之间的冲突。

但是,当我检查web.config时,我看到绑定重定向已就位:

  <dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
  </dependentAssembly>

这正是警告所建议的。

如何解决此警告?


是的,我进行了全面重建。我还将NuGet更新为最新版本,创建了新的解决方案,并重现了完全相同的问题。
Jim Lamb

Answers:


106

这是我用来修复警告的步骤:

  • 在VS中卸载项目
  • 编辑.csproj文件
  • 搜索对Newtonsoft.Json程序集的所有引用
    • 找到两个,一个对v6,一个对v5
    • 用v6替换对v5的引用
  • 重新载入专案
  • 生成并注意程序集引用失败
  • 查看参考文献,发现Newtonsoft.Json现在有两个。删除无法解决的问题。
  • 重建-无警告

12
我找到了两个引用,一个用于v6,一个用于v5,但是我删除了(未替换)v5。之后,我没有任何问题,例如“程序集引用失败”或用户界面中两个对Newtonsoft.Json的引用。我有人被塞住了install.ps1
ta.speot.is

感谢您的解决方案。我也从项目文件中删除了较旧的参考,并且没有问题。
2014年

31
+1-当我必须要做这样的事情时,这的确使我发疯。这就是为什么我总是不愿意在nuget软件包管理器上单击“升级”。
hylander0 2014年

1
我遇到了这个问题,并通过删除我没有意识到的多余参考文献进行了修复。这是指向Microsoft Connect错误的链接,这是那里存在额外参考的根本原因:connect.microsoft.com/VisualStudio/feedback/details/816725/…
Martin Costello 2014年

1
在我的案例中,虽然提到了6.0版,但它引用了两个不同版本的Newtonsoft.Json 11.0.1和11.0.2。
丹尼尔·罗伯

31

我遇到这个问题是因为我更新了软件包,其中包括对Newtonsoft.Json 4.5.6的引用的Microsoft.AspNet.WebApi,并且我已经安装了版本6。使用版本6还不够聪明。

为了解决它,在WebApi更新之后,我打开了工具> NuGet软件包管理器> Pacakge管理器控制台并运行:

 Update-Package Newtonsoft.Json

日志显示6.0.x和4.5.6版本都已更新为最新版本,一切都很好。

我觉得这会再次出现。


1
我的解决方案中包含多个项目,存在多个不同版本的问题,这完全解决了该问题,并将所有更新到最新的JSON.net。真好!
c0d3p03t 2014年

1
这是解决我的问题的最简单,最直接的解决方案。谢谢!
youngrrrr

21

我发现从项目文件中删除此部分可解决此问题。

<ItemGroup>
<Reference Include="Newtonsoft.Json">
  <HintPath>..\packages\Newtonsoft.Json.6.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>


就是这个。我想没有Newtonsoft.Json.6.0.1 / 6.0.3 / 6.0.5匹配到绑定重定向“ oldVersion =“ 0.0.0.0-6.0.0.0””,但是我不知道如何写正确的
幻想

这也是我的问题,我不确定是什么添加了它。
失忆症

为我工作。与v6.0和v12.0之间的冲突有关的错误。项目组参考是v11.0。因此,不确定发生了什么,但是就消除编译错误而言,除去项目组似乎已解决了该问题。
Brian.S

13

如果以上方法均无效,请尝试在web.config或app.config中使用它:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30AD4FE6B2A6AEED" culture="neutral"/>
            <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>

当您有一个使用较高版本的现有项目并添加了使用同一软件包的较旧版本的依赖项,因此您将旧版本重定向到新版本时,这是最适合的情况。
Ismail Hawayel

13

我从Newtonsoft.Json 11.0.1升级到12.0.2。在记事本++中打开项目文件,我发现

<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
      <HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
    </Reference>

<ItemGroup>
    <Reference Include="Newtonsoft.Json">
      <HintPath>..\packages\Newtonsoft.Json.11.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
    </Reference>
  </ItemGroup>

我删除了ItemGroup,其中将引用包装到带有11.0.1版本的提示路径。

这些问题可能会令人沮丧地发现。而且,开发人员通常会遵循与先前项目设置相同的步骤。先前的设置没有遇到问题。无论出于何种原因,项目文件有时都会错误地更新。

我非常希望微软能够从弹出的窗口中解决这些Visual Studio DLL的地狱问题。它发生得太频繁了,并导致进度突然停止,直到修复,这通常是反复试验造成的。


1
这正是问题所在。谢谢!
乔治法比什

8

程序集重定向错误的最终解决方案

好的,希望这应该可以解决所有(合理的)程序集引用差异...

  1. 检查错误。

上网浏览

  1. 程序集重定向后检查web.config。如果不存在,请创建一个。

现有的web.config程序集重定向

  1. 右键单击该装配的引用,然后选择“属性”。

在相关项目的“参考”列表中进行装配

  1. 在属性表中检查版本(不是运行时版本)。收到。

显示装配版本的属性表

  1. 粘贴到newVersion属性中。

使用更新的newVersion重定向web.config程序集

  1. 为了方便起见,请将oldVersion的最后部分更改为高,圆和虚构的部分。

使用更新的oldVersion重定向web.config程序集

麾。


这个答案节省了我很多时间!我有一个使用自定义C#库的Web应用程序,它们都使用相同的nuget包,但该Web应用程序的版本比该库的版本旧,并且重定向不包括该库使用的版本。
战争肉汁

4

请记住,使用绑定重定向

oldVersion =“ 0.0.0.0-6.0.0.0”

您是说dll的旧版本介于0.0.0.0版和6.0.0.0版之间。


1
oldVersion实际上,这里有点用词不当,您的意思是,您的程序集/ exe是使用对该范围内的版本的引用来构建的0.0.0.0-6.0.0.0,而实际安装的(和首选的)版本是下面的值newVersion(旧版本最好用措辞如下: “预期版本”和新版本最好用“实际可用版本”来
表述

2

没有人提到以下内容,根据我的理解,这是正确的解决方案:

转到安装了nuget的项目的csproj,并将设置AutoGEneratedBindingRedirectsfalse

<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>

MSDN中的全文。


1

我更新了程序包,甚至重新安装了它-但我仍然遇到与OP所述完全相同的错误。我通过执行以下操作手动编辑了所引用的dll。

我从参考中删除了newtonsoft.json.dll,然后从bin目录中手动删除了.dll。然后,我将nuget包文件夹中的newtonsoft.json.dll手动复制到项目bin中,然后通过浏览到.dll文件来添加引用。

现在,我的项目再次构建。


0

我有类似的问题,只是想在我的情况下为其他人提供答案。

我有一个与其他多个C#类lib项目一起运行ASP.NET Web应用程序的解决方案。

我的ASP.NET Web应用程序未使用json,但其他项目使用了json。

这是我解决的方法:

  1. 我确保所有正在使用任何版本的json的项目上都使用NuGet Update的最新版本(6)的项目-这不能解决问题
  2. 我使用NuGet将json添加到Web应用程序中-这解决了这个问题(让我深入探讨为什么):

步骤2首先是为json添加配置信息,这表明所有项目无论使用什么版本,都使用最新版本(6)。将程序集绑定添加到Web.Config很可能是修复程序。

但是,步骤2还清理了som旧代码。事实证明,我们以前在Web应用程序中使用了json的旧版本(5),并且在删除引用(我怀疑:手动)时未删除NuGet文件夹。添加最新的json(6),删除了旧文件夹(json v5)。这也可能是修复程序的一部分。


0

Veverke提到可以通过将AutoGEneratedBindingRedirects设置为false来禁用绑定重定向的生成。自发布此问题以来,不确定是否是新事物,但是在“工具/选项/ Nuget数据包管理器”中有一个“跳过应用绑定重定向”选项,可以切换。默认情况下它是关闭的,这意味着将应用重定向。但是,如果执行此操作,则必须手动管理任何必要的绑定重定向。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.