运行时出现“无法加载文件或程序集'Newtonsoft.Json, Version=6.0.0.0 ...'”,间接依赖程序集仍在寻找旧版本。

11

我有一个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, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed 来源: NotFound 6.0.0.0 由Microsoft.Azure.KeyVault, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 6.0.0.0 由Microsoft.Azure.KeyVault.WebKey, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 6.0.0.0 由Microsoft.Rest.ClientRuntime, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 6.0.0.0 由Microsoft.Rest.ClientRuntime.Azure, Version=3.0.0.0, Culture=neutral, 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。然后重新安装该软件包。 - bolkay
根据NuGet包依赖信息,将已安装的.Net框架升级至至少4.6.1版本:https://www.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,但问题仍然存在。 - Jeff Wang
@bolkay,刚试了一下,但不起作用。还是谢谢你的帮助! - Jeff Wang
@JeffWang:是的,我认为我遇到了同样的问题。我的项目有很多过时的依赖项,包括一个 Newtonsoft.json 6.0.6 的依赖项。只要我更新到 12.0.2,它就停止工作了。我不知道你是否找到了解决方法? - dtopham75
3个回答

0

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

  • *.csproj
  • packages.config
  • packages文件夹
  • bin文件夹
  • 您可以找到的任何其他地方

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

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


0

另一个选项是让Visual Studio重新构建(正确的)绑定重定向。以下是步骤:

  1. 备份(检入,shelfset,zip等)
  2. 打开您的web.config并删除所有当前的绑定重定向。这几乎是在assemblyBinding部分内的所有内容:

<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> *** 删除所有<dependentAssembly>的内容 *** </assemblyBinding> </runtime>

  1. 在Visual Studio中打开包管理器控制台。菜单:查看 -> 其他窗口 -> 包管理器控制台菜单
  2. 运行此命令:Get-Project -All | Add-BindingRedirect

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


0
除了其他答案之外...有时候你只需要一根大棒。特别是在“旧”风格的csproj中。新的PackageReference风格不太容易出现这种情况。
有时候,当sln以前使用旧版本构建时(旧文件未被覆盖),VS/msbuild可能会变得“混乱”。
步骤如下:
1. 关闭VS 2. 在powershell中,进入sln的根目录 3. ls -include obj,bin -recurse | rm -force -recurse 这将删除所有obj和bin文件夹。这拯救了我的理智很多次。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接