我正在尝试使用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)
我一直在用这些依赖性问题敲打我的脑袋,如果有人能指出我正确的方向,我将非常感激。
答案 0 :(得分:18)
找到解决方案,试试:
<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>
答案 1 :(得分:6)
您可以修改程序集绑定配置并添加重定向。请参阅MSDN上的Redirecting Assembly Versions。
您基本上想要将以下代码段添加到app.config
或web.config
文件中:
<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 /运行时依赖项不同 - 对Newtonsoft.Json&gt; = 4.0.8的NuGet依赖性仅表示允许您将SocektIO4Net安装到具有较新版本的Newtonsoft的项目中。 Json,它与运行时设置无关。
话虽这么说,如果您的项目有app.config或web.config文件,最近的NuGet版本应该自动添加程序集绑定重定向。
答案 2 :(得分:1)
在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>
请注意版本号需要与您安装的版本相匹配。
答案 3 :(得分:1)
有同样的问题。
刚刚解决了。
在NuGet用于安装具有Newtonsoft.JSON依赖性的Ext.NET之后发生了这种情况 在/ bin中已经有一个Newtonsoft.JSON.dll文件(显然是对web.config文件中的引用)文件夹没有检查我在调试时启动了NuGet Package-Install过程(所以文件可能有一个锁)。
在运行时错误窗口中,它将告诉您堆栈跟踪它有哪些部分清单存在问题,我的主要版本,所以我检查了安装包版本。这是一个主要版本。找到原始的NuGet文件:&#34; [物理路径] /../ packages / Newtonsoft.Json。[版本] / lib / [.net版本] /&#34;
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>
希望这有帮助
答案 4 :(得分:1)
在我的情况下,我用NuGet删除了包并安装了一个新包。然后,从“引用”中删除引用并再次手动添加。像魅力一样工作。希望为你解决。
答案 5 :(得分:1)
我最近在做一个旧项目。我需要更新我们的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>
答案 6 :(得分:1)
上述解决方案是正确的,但还有一点不容忽视: 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)已经依赖于另一个包。
有两种选择;
最后的建议,如果你正在与多个项目合作,例如。 exe-dll并检查两个版本是否有Newtonsoft.JSON。
答案 7 :(得分:0)
在Visual Studio 2013中出现上述错误
修复:在包mamnager执行:Install-package newtonsoft.json
这将在packages.config中添加一个新行
<package id="Newtonsoft.Json" version="6.0.5" targetFramework="net45" />
删除可能指向packages.config上的先前版本的上一行。
删除packagers目录中的旧版本目录。
删除NewtonSoft.Json的引用并读取它指向最新版本。
Root webconfig将具有以下内容
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
一切都完成了。关闭并重新打开视觉工作室。
这应该解决它。
我在安装时遇到了同样的错误
PM&GT; install-package durandal.starterkit
我用上面的方法修复。
答案 8 :(得分:0)
只是在 TeamCity 中发生这种情况,我想其他人很快就会遇到这种情况。这可能适用于拉动NuGet包的大多数构建服务器。
所有回复说明的答案都是正确的。但是,您仍需要定义正确的版本号。我的项目使用的是Newtonsoft.Json 7.0
,但他们刚刚发布了8.0
,而TeamCity正在关闭8.0
,这只会导致服务器问题,而不是本地问题。我的所有重定向都设置为7.0
。
确保已部署的应用程序实际上从NuGet获取正确的版本,而不仅仅是最新版本。或者更新您的配置以指向最新版本。
答案 9 :(得分:0)
其他解决方案对我不起作用。尽管我使用了不同的nuget包(Newtonsoft.Json.Schema版本= 3.0.0.0)。
因此,我的项目是一个ASP .NET项目,而.NET Standard项目中引用了Newtonsoft.Json.Schama包。解决方案只是将Nuget包也添加到WEB(或启动)项目中,问题就消失了。
答案 10 :(得分:-1)
我已经轻松解决了这个问题:我没有从编译文件夹中复制xml配置文件。
我只是确保xml配置文件也包含在我的程序中,一切正常!