26

我正在尝试使用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)

我整天都在为这些依赖问题头疼,如果有人能指出我正确的方向,我将不胜感激。

4

11 回答 11

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>
于 2014-06-27T21:24:47.583 回答
7

您可以修改程序集绑定配置并添加重定向。请参阅MSDN 上的重定向程序集版本

基本上,您想将以下代码段添加到您的app.configorweb.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/运行时依赖项不同 - NuGet 对 Newtonsoft.Json >= 4.0.8 的依赖仅意味着您将被允许将 SocektIO4Net 安装到具有较新版本 Newtonsoft.Json 的项目中,它具有与运行时设置无关。

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

于 2013-06-21T13:26:26.563 回答
3

上述解决方案是正确的,但还有一点不应该忘记: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)已经依赖于另一个包。

在此处输入图像描述

有两种选择;

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

最后一个建议,如果您正在处理多个项目,例如。exe-dll 并检查两个版本是否有 Newtonsoft.JSON。

于 2018-02-07T14:43:41.690 回答
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>

请注意版本号需要与您安装的版本相匹配。

于 2013-06-21T13:24:30.960 回答
1

就我而言,我使用 NuGet 删除了该软件包并安装了一个新软件包。然后,从 References 中删除引用并再次手动添加。像魅力一样工作。希望为你解决。

于 2016-12-09T02:12:46.140 回答
1

有同样的问题。

刚刚解决了。

它发生在使用 NuGet 安装具有 Newtonsoft.JSON 依赖项的 Ext.NET 之后。
/bin 中已经有一个 Newtonsoft.JSON.dll 文件(并且显然在 web.config 文件中引用它)文件夹没有检查我在调试时启动了 NuGet Package-Install 过程(因此该文件可能有锁)。

在运行时错误窗口上,它会在堆栈跟踪上告诉您清单的哪一部分有问题,我的是主要版本,所以我检查了安装包版本。这是 1 个主要版本。在以下位置找到原始 NuGet 文件:“[物理路径]/../packages/Newtonsoft.Json.[version]/lib/[.net version]/”

清单和库都在那里,因此将其复制到 /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>

希望这可以帮助

于 2015-11-17T11:01:52.730 回答
1

我最近在做一个旧项目。我需要更新我们的 Newtonsoft.Json.dll,因为我必须使用需要更新版本的“新”API,但我仍然有其他需要旧版本的 DLL。

你说的bindingRedirect?没有。它一直在抱怨清单不匹配。

单独的代码标签?没有。它一直在抱怨清单不匹配。

显然,问题是旧版本的 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>
于 2017-05-04T14:02:12.777 回答
0

我已经轻松解决了这个问题:我没有从编译文件夹中复制 xml 配置文件。

我只是确保 xml 配置文件也包含在我的程序中,并且一切正常!

于 2015-02-20T16:56:55.997 回答
0

得到上述错误:在 Visual Studio 2013 中修复:在包 mamnager 中执行:安装包 newtonsoft.json 这将在 packages.config 中添加一个新行 <package id="Newtonsoft.Json" version="6.0.5" targetFramework="net45" /> 删除可能指向 packages.config 上以前版本的上一行。在 packagers 目录中删除旧版本的目录。删除 NewtonSoft.Json 的引用并将其指向最新版本。<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> 一切完成后,根 webconfig 将具有以下 内容。关闭并重新打开视觉工作室。这应该解决它。我在安装 PM> install-package durandal.starterkit 时遇到了同样的错误,我使用上述方法修复。

于 2014-09-14T21:03:26.747 回答
0

其他解决方案对我不起作用。虽然我有不同的 nuget 包(Newtonsoft.Json.Schema version=3.0.0.0)。
所以我的项目是一个 ASP .NET 项目,而 Newtonsoft.Json.Schama 包在 .NET Standard 项目中被引用。解决方法是简单地将Nuget包也添加到WEB(或启动)项目中,问题就消失了。

于 2019-08-14T13:34:48.707 回答
0

刚刚在TeamCity中发生了这种情况,我想其他人很快就会遇到这种情况。这可能适用于大多数拉取 NuGet 包的构建服务器

所有说做重定向的答案都是正确的。但是,您仍然需要定义正确的版本号。我的项目正在使用Newtonsoft.Json 7.0,但是,他们刚刚发布8.0,TeamCity 正在拉下,8.0这仅在服务器上而不是在本地引起问题。我所有的重定向都设置为7.0.

确保部署的应用程序实际上从 NuGet 获得正确的版本,而不仅仅是最新最好的版本。或者更新您的配置以指向最新版本。

于 2016-01-05T18:31:55.163 回答