运行时无法加载文件或程序集“Newtonsoft.Json,版本=6.0.0.0 ...”,间接依赖程序集继续寻找旧版本

Posted

技术标签:

【中文标题】运行时无法加载文件或程序集“Newtonsoft.Json,版本=6.0.0.0 ...”,间接依赖程序集继续寻找旧版本【英文标题】:Could not load file or assembly 'Newtonsoft.Json, Version=6.0.0.0 ..." during runtime ,indirect dependency assembly keep looking for old version 【发布时间】:2019-10-10 01:48:04 【问题描述】:

我有一个 C# 项目,它直接引用了 Newtonsoft.Json 和一些其他引用(间接引用了 Newtonsoft.Json)。我想在所有地方将 Newtonsoft.Json 版本从 6.0.8 升级到最新的 12.0.2。

最初我得到了无法解决参考程序集的问题,但搜索后我尝试将绑定放入 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-12.0.0.0" newVersion="12.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

我的项目是这样的:

<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>
      <SpecificVersion>False</SpecificVersion>
      <Private>True</Private>
    </Reference>

现在问题变成了在运行时调用库时,它会抛出以下错误:

mymethod 抛出异常,将重试:无法加载文件或程序集 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' 或其依赖项之一。系统找不到指定的文件。”

使用AsmSpy,似乎间接引用是根本原因:

参考:Newtonsoft.Json,版本=6.0.0.0,文化=中性,PublicKeyToken=30ad4fe6b2a6aeed Newtonsoft.Json,版本=6.0.0.0,文化=中性,PublicKeyToken=30ad4fe6b2a6aeed 来源:未找到 Microsoft.Azure.KeyVault 的 6.0.0.0,版本=2.0.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35 6.0.0.0 by Microsoft.Azure.KeyVault.WebKey,版本=2.0.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35 6.0.0.0 by Microsoft.Rest.ClientRuntime,版本=2.0.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35 6.0.0.0 by Microsoft.Rest.ClientRuntime.Azure,版本=3.0.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35

通过启用诊断项目输出,构建时似乎很好:

2>  Unified primary reference "Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed". (TaskId:19)
2>      Using this version instead of original version "6.0.0.0" in "F:\packages\Microsoft.Azure.KeyVault.2.0.6\lib\net45\Microsoft.Azure.KeyVault.dll" because AutoUnify is 'true'. (TaskId:19)
2>      Using this version instead of original version "6.0.0.0" in "F:\packages\Microsoft.Azure.KeyVault.WebKey.2.0.4\lib\net45\Microsoft.Azure.KeyVault.WebKey.dll" because AutoUnify is 'true'. (TaskId:19)
2>      Using this version instead of original version "6.0.0.0" in "F:\packages\Microsoft.Rest.ClientRuntime.2.3.2\lib\net45\Microsoft.Rest.ClientRuntime.dll" because AutoUnify is 'true'. (TaskId:19)
2>      Using this version instead of original version "6.0.0.0" in "F:\packages\Microsoft.Rest.ClientRuntime.Azure.3.3.1\lib\net45\Microsoft.Rest.ClientRuntime.Azure.dll" because AutoUnify is 'true'. (TaskId:19)
2>      Resolved file path is "F:\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll". (TaskId:19)
2>      Reference found at search path location "HintPathFromItem". (TaskId:19)
2>      Found related file "F:\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.xml". (TaskId:19)
2>      The ImageRuntimeVersion for this reference is "v4.0.30319". (TaskId:19)

然后我尝试将所有这 4 个 nuget 包升级到最新版本并在我的解决方案中重新安装包,清理解决方案并重建,再试一次但仍然失败。

有没有人遇到过同样的问题以及如何解决这个问题?

【问题讨论】:

也许尝试强制卸载包。 uninstall-package newtonsoft.json -force。重新安装包。 根据 NuGet 包依赖信息将已安装的 .Net 框架至少升级到 4.6.1 版本:nuget.org/packages/Microsoft.Rest.ClientRuntime @NicoE ,据我了解,.Net 4.6.1 依赖意味着对 Newtonsoft.Json 的最低要求为 10.0.3,而 .Net 4.5.2 的最低要求为 6.0.8。所以我的.Net 不需要升级,不是吗?我已经尝试编译为 4.6.1,但问题仍然存在。 @bolkay,刚试过但不起作用。不过感谢您的帮助! @JeffWang:是的,我想我遇到了同样的问题。我有一个项目,其中包含许多过时的依赖项,包括 Newtonsoft.json 6.0.6 上的一个。一旦我更新到 12.0.2,它就会停止工作。我想你没有找到解决这个问题的方法吗? 【参考方案1】:

另一种选择是让 Visual Studio(正确地)重建绑定重定向。步骤如下:

    进行备份(签入、搁置集、zip 等) 打开您的 web.config 并删除所有当前绑定重定向。这几乎是assemblyBinding 部分中的所有内容:

<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> *** remove all of the <dependentAssembly> stuff *** </assemblyBinding> </runtime>

    在 Visual Studio 中打开包管理器控制台。菜单:查看 -> 其他窗口 -> 包管理器控制台菜单 运行此命令:Get-Project -All |添加绑定重定向

此命令将在您的项目中重建任何必要的绑定重定向。您可以重建、运行或部署,现在情况应该会更好。

【讨论】:

【参考方案2】:

只需从所有地方删除任何 Newtonsoft.Json 链接:

*.csproj packages.config 包文件夹 bin 文件夹 您能找到的任何其他地方

关闭项目,然后再次安装包:Install-Package Newtonsoft.Json -12.0.0

此外,如果您有链接,请检查任何其他项目中的 Newtonsoft.Json 版本。

【讨论】:

以上是关于运行时无法加载文件或程序集“Newtonsoft.Json,版本=6.0.0.0 ...”,间接依赖程序集继续寻找旧版本的主要内容,如果未能解决你的问题,请参考以下文章

无法加载文件或程序集“Newtonsoft.Json”或它的某一个依赖项

无法加载文件或程序集'Newtonsoft.Json,版本 = 10.0.0.0' - 但是 bin 文件夹中存在二进制文件

无法加载文件或程序集“Newtonsoft.Json,版本=4.5.0.0,文化=中性,PublicKeyToken=30ad4fe6b2a6aeed”

无法加载文件或程序集“Newtonsoft.Json,版本=9.0.0.0,文化=中性,PublicKeyToken=30ad4fe6b2a6aeed”或其依赖项之一

更新Newtonsoft.Json后报异常,未能加载文件或程序集“Newtonsoft.Json

未能加载文件或程序集 Newtonsoft.Json, Version=4.5.0.0 的报错,解决方法