Newtonsoft.json程序集包版本不匹配。

28
我正在尝试使用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版本存在一些不一致性...? - Chris Mantle
11个回答

19

找到解决方案,请尝试以下方法:

<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>

7
您可以修改程序集绑定配置并添加重定向。请参见MSDN上的重定向程序集版本
基本上,您需要将以下代码片段添加到您的app.configweb.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 >= 4.0.8的NuGet依赖项仅意味着您可以将SocektIO4Net安装到具有较新版本Newtonsoft.Json的项目中,它与运行时设置无关。

话虽如此,如果您的项目具有app.config或web.config文件,则最近的NuGet版本应自动为您添加程序集绑定重定向。


当我将这段代码放入我的工作角色的App.Config中时,符号不会加载,并且会出现错误“Microsoft.ServiceBus.pdb未加载”。我不确定为什么在进行上述程序集重定向时会出现此问题。如果我删除重定向,则不会发生这种情况。有任何想法吗? - Bitsian
我在想,我是不是需要将4.0.8重定向到4.5.11?我在你的代码中看到旧版本和新版本都有4.5.11。 - Bitsian
@Bitsian 我不知道“Microsoft.ServiceBus.pdb未加载”的原因是什么。可能是之前由程序集绑定错误隐藏的另一个bug。 - Miroslav Bajtoš
好的!那么4.0.8呢?我需要在旧版本中提到它吗?因为这是socketio4Net库所期望的! - Bitsian
您可以使用范围来指定旧版本。在我的例子中,“1.0.0.0-4.5.11.0”表示从1.0.0.0开始到4.5.11.0的所有版本(包括4.0.8.0)。 - Miroslav Bajtoš

4
上述解决方案是正确的,但还有一个重要的点不能被忘记:`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) 已经依赖于另一个软件包。

enter image description here

有两个选择;

  1. 更新(Newtonsoft.JSON package)到最新版本。
  2. 更新app.config文件中的版本号

最后的建议,如果你正在使用多个项目,比如 exe-dll,并检查其中是否有 Newtonsoft.JSON 的版本。


2

遇到了同样的问题。

刚刚解决了。

NuGet 用于安装 Ext.NET 后出现了这个问题,它依赖于 Newtonsoft.JSON。
在 /bin 文件夹中已经有一个 Newtonsoft.JSON.dll 文件(显然 web.config 文件中也有对它的引用),而我在调试时开始了 NuGet Package-Install 过程,没有检查文件是否被锁定。

运行时错误窗口会告诉您堆栈跟踪中哪部分清单出现了问题,我的是主版本,所以我检查了安装包版本。它的主版本相差1个版本。在 "[物理路径]/../packages/Newtonsoft.Json.[版本]/lib/[.net 版本]/" 下找到了原始的 NuGet 文件。

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>

希望这有所帮助。

1
在您的应用程序/ 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未加载”。我不确定为什么在进行上述程序集重定向时会出现此问题。如果我删除重定向,则不会发生这种情况。有任何想法吗? - Bitsian
我在想,我是否需要将4.0.8重定向到4.5.11?我在你的代码中看到了旧版本和新版本中都有4.5.11。 - Bitsian

1
在我的情况下,我使用NuGet删除了该软件包并安装了一个新的。然后,手动从引用中删除该软件包,并再次添加。像魔法一样有效。希望能为您解决问题。

1
我最近在处理一个旧项目。我需要更新我们的Newtonsoft.Json.dll,因为我必须使用一个需要较新版本的“新”API,但我还有其他需要旧版本的DLL。
你说bindingRedirect?不行。它一直抱怨清单不匹配。
分开的codeBase标签?也不行。它一直抱怨清单不匹配。
问题在于,显然旧版的Newtonsoft.Json.dll(3.0.0.0)没有PublicKeyToken,但是“新”版本(4.5.7.1)有PublicKeyToken。因此,它们不能共享相同的dependentAssembly标签。
这就是我最终得到的结果:
<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>

根据http://msdn.microsoft.com/en-us/library/7wd6ex19.aspx的说明,您无法重定向未经强名称的程序集版本。对于未经强名称的程序集,公共语言运行时会忽略其版本。 - PaulBinder

0

其他解决方案对我没有用。尽管我有不同的Nuget包(Newtonsoft.Json.Schema版本=3.0.0.0)。
所以我的项目是一个ASP .NET项目,而Newtonsoft.Json.Schama包被引用在一个.NET Standard项目中。解决方案很简单,只需将Nuget包添加到WEB(或启动)项目中,问题就会消失。


0
在Visual Studio 2013中出现了上述错误: 解决方法:在包管理器中执行:Install-package 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" /> 完成所有操作后,关闭并重新打开Visual Studio。 这应该可以解决问题。 我在安装PM> install-package durandal.starterkit时遇到了同样的错误。 我使用了以上方法来解决。

0
我已经轻松解决了这个问题:我没有从编译文件夹中复制xml配置文件。
我只是确保我的程序与xml配置文件一起包含,一切都正常工作!

这是我的Visio插件的解决方案...谢谢 - David Parker

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