【问题标题】:How can I fix assembly version conflicts with JSON.NET after updating NuGet package references in a new ASP.NET MVC 5 project?在新的 ASP.NET MVC 5 项目中更新 NuGet 包引用后,如何修复与 JSON.NET 的程序集版本冲突?
【发布时间】:2014-02-25 05:03:05
【问题描述】:

我在 VS 2013(更新 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>

这正是警告所建议的。

如何解决此警告?

【问题讨论】:

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

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


【解决方案1】:

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

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

【讨论】:

  • 我找到了两份参考资料,一份用于 v6,一份用于 v5,但我删除(未替换)v5 的一份。之后,我没有遇到任何问题,例如“程序集引用失败”或 UI 中对 Newtonsoft.Json 的两次引用。我有人堵住了install.ps1
  • 感谢您的解决方案。我也从项目文件中删除了较旧的引用并且没有问题。
  • +1 - 当我不得不做这样的事情时,它真的让我发疯。这就是为什么我总是犹豫点击 nuget 包管理器上的升级。
  • 我遇到了这个问题,并通过删除我没有意识到的额外参考来解决它。这是指向 Microsoft Connect 错误的链接,这是额外引用存在的根本原因:connect.microsoft.com/VisualStudio/feedback/details/816725/…
  • 在我的例子中,有两个不同版本的 Newtonsoft.Json 11.0.1 和 11.0.2 的引用,尽管它抱怨的是 6.0 版。
【解决方案2】:

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

为了解决这个问题,在 WebApi 更新后,我打开了 Tools > NuGet Package Manager > Pacakge Manager Console 并运行:

 Update-Package Newtonsoft.Json

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

我感觉这会再次出现。

【讨论】:

  • 我在包含多个项目的解决方案中遇到了多个不同版本的问题,这完全解决了这个问题并将所有内容更新到最新的 JSON.net。不错!
  • 这是解决我的问题的最简单、最直接的解决方案。谢谢!
【解决方案3】:

我发现从项目文件中删除这部分修复了问题。

<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。所以不确定发生了什么,但删除项目组似乎已经解决了它,就删除编译错误而言。
【解决方案4】:

我从 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 地狱问题,以免出现问题。它发生得太频繁了,导致进度戛然而止,直到它被修复,通常是通过反复试验。

【讨论】:

  • 这正是问题所在。谢谢!
  • 我也有两个条目。两者完全相同的版本,但也有这个错误。我删除了第二个
【解决方案5】:

如果以上都不起作用,请尝试在 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>

【讨论】:

  • 这最适合当你有一个使用更高版本的现有项目并且你添加一个使用相同包的旧版本的依赖项的情况,所以你将旧版本重定向到新版本.
【解决方案6】:

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

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

  1. 检查错误。

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

  1. 右键单击程序集的引用并选择“属性”。

  1. 检查属性表中的版本(不是运行时版本)。复制那个。

  1. 粘贴到 newVersion 属性中。

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

欢喜。

【讨论】:

  • 这个答案为我节省了很多时间!我有一个使用自定义 C# 库的 Web 应用程序,两者都使用相同的 nuget 包,但 Web 应用程序的版本比库旧,并且重定向不包括库正在使用的版本。
【解决方案7】:

记住绑定重定向

oldVersion="0.0.0.0-6.0.0.0"

你是说dll的旧版本在0.0.0.0和6.0.0.0之间。

【讨论】:

  • oldVersion 实际上在这里有点用词不当,您的意思是您的程序集/exe 是参考0.0.0.0-6.0.0.0 范围内的版本构建的,并且实际安装的 (和首选)版本是newVersion 下的值(旧版本更好地表述为“预期版本”,新版本更好地表述为“实际可用版本”)
【解决方案8】:

没有人提到以下,在我的理解是正确的解决方案:

进入安装nuget的项目的csproj,将AutoGEneratedBindingRedirects设置为false

&lt;AutoGenerateBindingRedirects&gt;false&lt;/AutoGenerateBindingRedirects&gt;

Full article in MSDN.

【讨论】:

    【解决方案9】:

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

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

    现在我的项目再次构建。

    【讨论】:

      【解决方案10】:

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

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

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

      这就是我修复它的方法:

      1. 我确保所有使用最新版本 (6) 的项目对当前使用任何版本 json 的所有项目都使用 NuGet 更新 - 这没有解决问题
      2. 我使用 NuGet 将 json 添加到 Web 应用程序 - 这解决了问题(让我深入了解原因):

      第 2 步首先为 json 添加配置信息,即建议所有项目,无论他们有什么版本,都使用最新版本 (6)。将程序集绑定添加到 Web.Config 很可能是解决方法。

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

      【讨论】:

        【解决方案11】:

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

        【讨论】:

          猜你喜欢
          • 2019-01-12
          • 2022-06-13
          • 2013-12-13
          • 1970-01-01
          • 2023-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多