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 中添加一个新行 &lt;package id="Newtonsoft.Json" version="6.0.5" targetFramework="net45" /&gt; 删除可能指向 packages.config 上以前版本的上一行。 在 packagers 目录中删除旧版本的目录。 删除 NewtonSoft.Json 的引用并将其指向最新版本。 根 webconfig 将具有以下内容 &lt;bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /&gt; 一旦一切完成。关闭并重新打开视觉工作室。 这应该解决它。 我在安装时遇到了同样的错误 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.configweb.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 地狱)

程序集版本不匹配

更新Newtonsoft.Json后报异常,未能加载文件或程序集“Newtonsoft.Json

无法加载文件或程序集“Newtonsoft.Json”或它的某一个依赖项