Newtonsoft.json 程序集包版本不匹配
Posted
技术标签:
【中文标题】Newtonsoft.json 程序集包版本不匹配【英文标题】:Newtonsoft.json assembly package version mismatch 【发布时间】:2013-06-18 15:35:52 【问题描述】:我正在尝试使用SocketIO4Net 在.net 中创建socket.io 客户端。看来 SocketIO4Net 具有 Newtonsoft.Json >= 4.0.8 的依赖项。我也在使用 PushSharp 库,它的 Newtonsoft.Json 依赖项 >= 4.5.10。当我第一次安装 PushSharp 时,我得到了 NewtonSoft.Json 4.5.11,我认为这个版本也应该支持 SocketIO4Net,因为它的版本更高,但是每当我尝试连接到 socket.io 服务器时都会出现这个错误。
无法加载文件或程序集“Newtonsoft.Json, Version=4.0.8.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)
我整天都在为这些依赖问题头疼,如果有人能指出我正确的方向,我将不胜感激。
【问题讨论】:
仅供参考,我们也遇到过这种情况,Newtonsoft.Json 的版本完全相同。在我们的例子中,是 PlainElastic.NET 引入了旧的 4.0.8 版本。 NuGet 中保存的 Newtonsoft.Json 版本可能存在一些不一致...? 相关,并以Newtonsoft.Json为例:Assembly Loading Version Mismatch: Why is it loading?。另见Is it possible to replace a reference to a strongly-named assembly with a “weak” reference?。 这能回答你的问题吗? Could not load file or assembly 'Newtonsoft.Json' or one of its dependencies. Manifest definition does not match the assembly reference 【参考方案1】:其他解决方案对我不起作用。虽然我有不同的 nuget 包(Newtonsoft.Json.Schema version=3.0.0.0)。 所以我的项目是一个 ASP .NET 项目,而 Newtonsoft.Json.Schama 包在 .NET Standard 项目中被引用。解决的办法就是把Nuget包也加到WEB(或启动)项目中,问题就消失了。
【讨论】:
【参考方案2】:上述解决方案是正确的,但还有一点不应该忘记:app.config内容与上述解决方案相同。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
但最好检查一下它是否是最新的。就我而言,Newtonsoft.JSON (v.6.0.4) 已经依赖于另一个包。
有两种选择;
-
更新(Newtonsoft.JSON 包) 最新版本。
更新app.config文件中的版本号。
最后一个建议,如果您正在处理多个项目,例如。 exe-dll 并检查两个版本是否有 Newtonsoft.JSON。
【讨论】:
【参考方案3】:我最近在做一个旧项目。我需要更新我们的 Newtonsoft.Json.dll,因为我必须使用需要更新版本的“新”API,但我仍然有其他需要旧版本的 DLL。
bindingRedirect 你说?没有。它一直在抱怨清单不匹配。
单独的 codeBase 标签?没有。它一直在抱怨清单不匹配。
问题显然在于,旧版本的 Newtonsoft.Json.dll (3.0.0.0) 没有 PublicKeyToken,但“新”版本 (4.5.7.1 ) 确实有一个 PublicKeyToken。因此他们不能共享同一个dependentAssembly-tag。
这就是我最终的结果:
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="" culture="neutral"/>
<codeBase version="3.0.0.0" href="bin\Newtonsoft_Old\Newtonsoft.Json.dll" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
<codeBase version="4.5.0.0" href="bin\Newtonsoft.Json.dll" />
</dependentAssembly>
【讨论】:
根据msdn.microsoft.com/en-us/library/7wd6ex19.aspx“您不能重定向非强命名程序集的版本。公共语言运行库会忽略非强命名程序集的版本。”【参考方案4】:就我而言,我使用 NuGet 删除了该软件包并安装了一个新软件包。然后,从 References 中删除引用并再次手动添加。像魅力一样工作。希望为你解决。
【讨论】:
【参考方案5】:刚刚在 TeamCity 中发生过这种情况,我想其他人很快就会遇到这种情况。这可能适用于大多数构建服务器,它们会拉取 NuGet 包。
所有说做重定向的答案都是正确的。但是,您仍然需要定义正确的版本号。我的项目正在使用Newtonsoft.Json 7.0
,但是,他们刚刚发布了8.0
,而TeamCity 正在拉下8.0
,这只会在服务器上而不是在本地引起问题。我所有的重定向都设置为7.0
。
确保部署的应用程序实际上从 NuGet 获得正确的版本,而不仅仅是最新最好的版本。或者更新您的配置以指向最新版本。
【讨论】:
【参考方案6】:遇到了同样的问题。
刚刚解决了。
它发生在使用 NuGet 安装 Ext.NET 之后,它具有 Newtonsoft.JSON 的依赖项。 /bin 中已经有一个 Newtonsoft.JSON.dll 文件(并且显然在 web.config 文件中引用它)文件夹没有检查我在调试时启动了 NuGet Package-Install 过程(因此该文件可能有一个锁定)。
在运行时错误窗口中,它会在堆栈跟踪中告诉您清单的哪一部分有问题,我的是主要版本,所以我检查了安装包版本。这是 1 个主要版本。在以下位置找到原始 NuGet 文件:“[物理路径]/../packages/Newtonsoft.Json.[version]/lib/[.net version]/”
Manifest 和 Library 都在那里,因此将其复制到 /bin 文件夹中,更新了根 web.config 程序集信息并且它可以工作。
代码示例: 之前
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
之后
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="7.0.0.0" />
</dependentAssembly>
希望对你有帮助
【讨论】:
【参考方案7】:我已经轻松解决了这个问题:我没有从编译文件夹中复制 xml 配置文件。
我只是确保 xml 配置文件也包含在我的程序中,并且一切正常!
【讨论】:
这是我的 Visio 加载项的解决方案...谢谢【参考方案8】:出现上述错误:在 Visual Studio 2013 中
修复:在包 mamnager 中执行:安装包 newtonsoft.json
这将在 packages.config 中添加一个新行
<package id="Newtonsoft.Json" version="6.0.5" targetFramework="net45" />
删除可能指向 packages.config 上以前版本的上一行。
在 packagers 目录中删除旧版本的目录。
删除 NewtonSoft.Json 的引用并将其指向最新版本。
根 webconfig 将具有以下内容
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
一旦一切完成。关闭并重新打开视觉工作室。
这应该解决它。
我在安装时遇到了同样的错误
PM> 安装包 durandal.starterkit
我用上面的方法修复。
【讨论】:
【参考方案9】:找到解决方案,尝试:
<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>
【讨论】:
【参考方案10】:您可以修改程序集绑定配置并添加重定向。请参阅 MSDN 上的 Redirecting Assembly Versions。
基本上你想在app.config
或web.config
文件中添加以下sn-p:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json"
publicKeyToken="30ad4fe6b2a6aeed"
culture="neutral" />
<!--
Assembly versions can be redirected in application,
publisher policy, or machine configuration files.
-->
<bindingRedirect oldVersion="1.0.0.0-4.5.11.0" newVersion="4.5.11.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
编辑
为什么需要重定向程序集版本?尽管 SocketIO4Net 支持较新版本的 Newtonsoft.Json,但它是针对单个版本(在您的情况下为 4.0.8)编译的。此版本存储在 DLL 中,用于加载 SocketIO4Net 所依赖的 DLL。
请注意,NuGet 依赖项与 DLL/运行时依赖项不同 - NuGet 依赖于 Newtonsoft.Json >= 4.0.8 仅意味着您将被允许将 SocektIO4Net 安装到具有较新版本 Newtonsoft.Json 的项目中,它与运行时设置无关。
话虽如此,如果您的项目有 app.config 或 web.config 文件,最新的 NuGet 版本应该会自动为您添加程序集绑定重定向。
【讨论】:
当我将此代码放入我的辅助角色 App.Config 中时,符号不会加载,并且我收到错误“Microsoft.ServiceBus.pdb 未加载”。我不确定为什么在进行上述程序集重定向时会出现这种情况。当我删除重新直接时,它不会发生。有什么想法吗? 我想知道我不需要从 4.0.8 重定向到 4.5.11 吗?我在你的代码中看到新旧版本都是4.5.11? @Bitsian 我不知道“Microsoft.ServiceBus.pdb 未加载”的原因。可能是之前被程序集绑定错误隐藏的另一个错误。 好的! 4.0.8呢?我需要在旧版本中提及吗?因为这就是 socketio4Net 库所期望的! 您可以将范围用于 oldVersion。在我的示例中,“1.0.0.0-4.5.11.0”表示从 1.0.0.0 到 4.5.11.0(包括 4.0.8.0)的所有版本。【参考方案11】:在你的 app/web.config 中加入一个程序集重定向;
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" PublicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="1.0.0.0-4.5.11.0" newVersion="4.5.11.0" />
</dependentAssembly>
请注意版本号需要与您安装的版本相匹配。
【讨论】:
当我将此代码放入我的辅助角色 App.Config 中时,符号不会加载,并且我收到错误“Microsoft.ServiceBus.pdb 未加载”。我不确定为什么在进行上述程序集重定向时会出现这种情况。当我删除重新直接时,它不会发生。有什么想法吗? 我想知道我不需要从 4.0.8 重定向到 4.5.11 吗?我在你的代码中看到新旧版本都是4.5.11?以上是关于Newtonsoft.json 程序集包版本不匹配的主要内容,如果未能解决你的问题,请参考以下文章
MVC4.0:未能加载文件或程序集“Newtonsoft.Json, Version=4.5.0.0 ”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配
未能加载文件或程序集“Newtonsoft.Json”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
Newtonsoft Json.NET 版本不兼容(DLL 地狱)