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

时间:2019-05-23 13:10:23

标签: c# .net json json.net .net-assembly

我有一个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,版本= 6.0.0.0,Culture =中性,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       Microsoft.Azure.KeyVault.WebKey 6.0.0.0,版本= 2.0.0.0,区域性=中性,PublicKeyToken = 31bf3856ad364e35       Microsoft.Rest.ClientRuntime 6.0.0.0,版本= 2.0.0.0,文化=中性,PublicKeyToken = 31bf3856ad364e35       Microsoft.Rest.ClientRuntime.Azure 6.0.0.0,版本= 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软件包升级到最新版本,并在解决方案,清理解决方案和重建中重新安装了软件包,请重试,但仍然失败。

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

2 个答案:

答案 0 :(得分:0)

只需从所有位置删除任何Newtonsoft.Json链接:

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

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

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

答案 1 :(得分:0)

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

  1. 进行备份(签入,架子集,zip等)
  2. 打开您的web.config并删除所有当前的绑定重定向。 assemblyBinding部分中的几乎所有内容:

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

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

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