Newtonsoft.json汇编包版本不匹配

时间:2013-06-21 13:21:14

标签: c# dependencies nuget json.net socketio4net

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

我一直在用这些依赖性问题敲打我的脑袋,如果有人能指出我正确的方向,我将非常感激。

11 个答案:

答案 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.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&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)已经依赖于另一个包。

enter image description here

有两种选择;

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

    最后的建议,如果你正在与多个项目合作,例如。   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配置文件也包含在我的程序中,一切正常!