运行时无法加载文件或程序集“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”或其依赖项之一