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

时间:2014-02-01 12:31:37

标签: asp.net-mvc json.net nuget visual-studio-2013 asp.net-mvc-5.1

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

  

警告MSB3243:无法解决" Newtonsoft.Json,Version = 6.0.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed"之间的冲突。和" Newtonsoft.Json,Version = 4.5.0.0,Culture = neutral,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>

这正是警告所建议的。

如何修复此警告?

11 个答案:

答案 0 :(得分:94)

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

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

答案 1 :(得分:26)

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

要解决此问题,请在WebApi更新后打开工具&gt; NuGet包管理器&gt; Pacakge Manager Console并运行:

 Update-Package Newtonsoft.Json

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

我有种感觉会再次出现。

答案 2 :(得分:14)

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

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

答案 3 :(得分:9)

如果上述方法均无效,请尝试在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>

答案 4 :(得分:4)

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

好的,希望这有助于解决任何(理智)程序集引用差异......

  1. 检查错误。
  2. Surf to the website

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

      1. 右键单击装配的参考,然后选择“属性”。
      2. Assembly in the Reference list, in the relevant project

        1. 检查“属性”表中的版本(不是运行时版本)。复制那份。
        2. Properties table showing Version of assembly

          1. 粘贴到newVersion属性。
          2. web.config assembly redirect with updated newVersion

            1. 为方便起见,将oldVersion的最后一部分更改为高,圆和虚。
            2. web.config assembly redirect with updated oldVersion

              飘柔。

答案 5 :(得分:3)

请记住使用绑定重定向

  

oldVersion = “0.0.0.0-6.0.0.0”

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

答案 6 :(得分:2)

我从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>

我删除了将引用与11.0.1版本的提示路径一起包裹的ItemGroup。

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

我非常希望微软能够从弹出的窗口中解决这些Visual Studio DLL的地狱问题。它发生得太频繁了,并导致进展缓慢,直到通过修复和修复将其修复为止。

答案 7 :(得分:0)

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

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

我的ASP.NET Web应用程序没有使用json,而是使用其他项目。

这就是我修复它的方法:

  1. 我确保所有使用最新版本(6)的项目在当前使用任何版本的json的所有项目中使用NuGet Update - 这无法解决问题
  2. 我使用NuGet将json添加到Web应用程序中 - 这解决了问题(让我深入了解原因):
  3. 第2步首先添加了json的配置信息,这表明所有项目都使用最新版本(6),无论他们拥有什么版本。将程序集绑定添加到Web.Config很可能就是修复。

    但是,第2步还清理了som遗留代码。原来我们之前在我们的Web应用程序中使用了json的旧版本(5),并且当引用(我怀疑:手动)被删除时,NuGet文件夹没有被删除。添加最新的json(6),删除旧文件夹(json v5)。这也可能是修复的一部分。

答案 8 :(得分:0)

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

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

现在我的项目再次构建。

答案 9 :(得分:0)

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

转到安装了nuget的项目的csproj,然后将AutoGEneratedBindingRedirects设置为false

<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>

Full article in MSDN.

答案 10 :(得分:0)

Veverke提到可以通过将AutoGEneratedBindingRedirects设置为false来禁用绑定重定向的生成。自从发布此问题以来,不确定是否是新事物,但是在Tools / Options / Nuget Packet Manager中有一个“跳过应用绑定重定向”选项,可以切换。默认情况下它是关闭的,这意味着将应用重定向。但是,如果这样做,则必须手动管理所有必要的绑定重定向。