【问题标题】:Newtonsoft.json assembly package version mismatchNewtonsoft.json 程序集包版本不匹配
【发布时间】: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)

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

【问题讨论】:

标签: c# dependencies nuget json.net socketio4net


【解决方案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) 已经依赖于另一个包。

    有两种选择;

    1. 更新(Newtonsoft.JSON 包) 最新版本。
    2. 更新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>
      

      【讨论】:

      【解决方案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?
                猜你喜欢
                • 2012-09-04
                • 1970-01-01
                • 2011-07-20
                • 2014-05-15
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-10-14
                相关资源
                最近更新 更多