无法加载文件或程序集“Newtonsoft.Json,Version=4.5.0.0,Culture=neutral,PublicKeyToken=30ad4fe6b2a6aeed”

265

我遇到了以下错误:

System.IO.FileLoadException : 无法加载文件或程序集 'Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' 或其某个依赖项。所定位的程序集清单定义与程序集引用不匹配。(HRESULT 异常: 0x80131040)

这是我的 CI 构建过程中出现的问题。

我尝试了以下解决方案:

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

它还是不起作用了


错误意味着.NET找不到Json.NET库。您是否已安装它? - TypeIA
30
完全相同的问题 - 让我感到很烦。如果您找到解决方案,请告诉我。 - Dean Chalk
实际上,对我来说添加你尝试过的内容解决了问题。 - h.alex
使用NuGet包管理器中的合并选项,确保版本不会分离。 - niico
这是唯一对我有效的方法:https://github.com/Redth/PushSharp/issues/361#issuecomment-181387928 - RichC
46个回答

258
在包管理器控制台中执行:Update-Package –reinstall Newtonsoft.Json更新 我最初将此发布为评论,但正如@OwenBlacker建议的那样,我将把它放在这里: 如果您执行此操作后仍然出现错误,则最终适用于我的是从我的.config文件中删除Json.Net的<dependentAssembly>部分。重新安装会将其带回来,如果没有它,显然需要将其删除。在包本身有正常解决方案之前,恐怕这一手动步骤是必需的。 注意:在执行此操作之前,请阅读下面的评论。 根据René在下面的评论中指出,请注意 ,答案中发布的命令将在解决方案中的每个项目中重新安装该软件包。因此,如果您在多个项目中使用Newtonsoft.Json软件包并可能使用不同版本,则仅执行上述命令可能会产生意想不到的后果。

9
为了让所有人都能读懂:我已经尝试过那个方法,但仍然出现了错误。后来我想出了一个解决方法:令人惊讶的是,我不得不从我的 .config 文件中删除 Json.Net 的 <dependentAssembly> 部分。如果没有这一部分,重新安装会将其恢复,而你需要将其删除。在包本身有正常解决方案之前,恐怕这个手动步骤是必须的。 - Ofer Zelig
51
请注意,答案中发布的命令将重新安装解决方案中_每个_项目中的包。因此,如果您在多个项目中使用Newtonsoft.Json包,并且可能使用不同版本,则仅执行上述命令可能会产生意想不到的后果。 - René
解决了!对我来说,我在一个项目中安装了v6,从包管理器重新安装后升级到了v7。 - jv-dev
不得不这样做才能让GeoIP2-dotnet正常运行。 - Matt Borja
包管理器命令对我无效,但编辑app.config有效。谢谢。 - MonkeyWrench
显示剩余7条评论

136

对于所有遇到Newtonsoft.Json v4.5版本问题的人,请尝试在web.config或app.config中使用以下内容:

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

重要提示:检查您的配置文件中的configuration标签是否没有命名空间属性(如https://dev59.com/e3I-5IYBdhLWcg3wpaB1#12011221所建议)。否则,assemblyBinding标签将被忽略。


3
对我而言,在清理后手动删除bin文件夹中的内容(并非清空它)就可以解决问题,这是在我使用了此答案之后得到的结果。 - Mikaël Mayer
非常好!截至2015年7月4日,Newtonsoft.Json的当前版本为7.0.0,因此newVersion="6.0.0.0"必须更改为newVersion="7.0.0.0"或您正在使用的任何版本。 - Moses Machua
我在使用DNN和newtonsoft.json.dll时遇到了类似的问题,其中DNN使用版本4.5,而我的模块想要使用7.0。由于我无法升级dnn安装程序以使用7.0,因此我添加了一个dependentAssembly条目,使用oldversion = 0.0-7.0和“新”版本作为旧4.5。它奏效了。 - Jake Gaston
3
那个关于命名空间的注释……我真想拥抱你。因为那个注释,我浪费了好几个小时都不知道绑定重定向被忽略了。 - Brian
1
命名空间的注释非常重要,以至于它本身可以作为一个答案。非常感谢。 - MÇT
显示剩余2条评论

51

关键点是在配置文件中引用正确的版本。

步骤:

1- 查看项目引用属性中 Newtonsoft.Json.dll 的版本,无论您的包文件夹中的版本为何(例如我的版本是 7.0.1,而引用版本为 7.0.0.0)

2- 查看项目在异常中期望您提供的版本(我的是 6.0.0.0)

3- 根据实际情况添加相关程序集到您的配置文件中。

  <dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json"  publicKeyToken="30AD4FE6B2A6AEED" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="7.0.0.0"/>
  </dependentAssembly>

抱歉,我只能给你的分数投一票(例如我的是7.0.1,而参考版本是7.0.0.0),但这对评分结果产生了很大的影响。如果可以的话,我会给更高的分数......谢谢 :) - Zaker
这对我有用。我将版本更新为7,但实际上它正在运行版本8,所以我只是将newVersion更改为8.0,谢谢! - Keith
尽管在NuGet包管理器中安装了8.0.3版本,但引用下的.dll仍然是8.0.0。因此,我在web.config中将其更改为8.0.0.0。奇怪的是,昨天发布时这个方法还有效,但今天早上就不行了。 - CularBytes
你如何找到参考版本?在重定向中使用12.0.3.0不起作用,但12.0.0.0可以。除了纯粹的巧合之外,我怎么会发现这个问题呢?它是否有详细说明?它无法找到存在于bin文件夹中的12.0.3.0,但显然可以找到12.0.0.0,而这个版本化的程序集实际上并不存在! - Murphybro2

27

我尝试了这里提供的所有解决方案(卸载、重新安装、删除引用、创建BindingRedirects等),但都没有成功。我不得不返回到旧版本的Newtonsoft。之前版本5.0.6一直在工作,所以我尝试使用那个版本。我需要在套件控制台中输入以下两个命令:

uninstall-package newtonsoft.json -force

install-package newtonsoft.json -version "5.0.6"

第一个命令中的-force选项是强制卸载所必需的。其他程序集的依赖关系会阻止卸载操作。


运行得非常好。我的MVC 4项目中出现了错误。几乎要切换到本地序列化程序。 - Kees C. Bakker
谢谢,我只需要将“-version”从“5.0.6”更改为“-pre”: install-package newtonsoft.json -pre - thiago.adriano26

25

我通过在我的.config文件中添加这个绑定重定向来解决了这个问题:

<runtime>
    . . . 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed"
                culture="neutral" />
            <bindingRedirect oldVersion="4.5.0.0" newVersion="6.0.0.0" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

错误信息指出找不到版本4.5.0.0,而当前版本的Newtonsoft.Json是6.0.0.0,因此重定向应该从4.5到6.0,而不是相反。


是的,这解决了我的问题。JSON.NET引起的问题数量如此之多,但一旦它运行起来,就像梦幻般的机器。谢谢 +1 - Piotr Kula
你的代码片段让我意识到缺少了'assemblyBinding'元素。谢谢。 - Ricardo stands with Ukraine

22

我认为你指向了错误的目标,请将其更改为4.5而不是6.0。

<dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed"
        culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="4.5.0.0" />
</dependentAssembly>

这应该可以工作。


1
Umbraco 7需要4.5.0.0,因此这有助于使其运行。 - MagicalArmchair

22

我花了几天时间试图解决这个令人沮丧的问题。我尝试了网上能找到的所有方法,最终发现(像我这种情况)该错误可能是由一个解决方案中不同的目标 .Net 项目版本(4.5 和 4.5.1)引起的。以下步骤为我解决了这个问题:

  1. 仔细检查解决方案中每个项目的 .Net 版本。只需右键单击项目并转到 属性

enter image description here

  1. 如果可能,请为所有项目设置相同的 .Net 版本。如果不行,至少尝试更改“启动项目”(对我来说,这是导致问题的项目)。

  2. 从解决方案中删除所有 Newtonsoft.Json 包。

    uninstall-package newtonsoft.json -force

  3. 在所有 packages.config 文件中更新所有 Newtonsoft.Json 版本,如下所示:

    <package id="Newtonsoft.Json" version="7.0.1" targetFramework="net451" />

  4. 使用“程序包管理器控制台”重新安装 Newtonsoft.Json

    install-package newtonsoft.json

  5. 重新构建解决方案

(可选) 7. 如果更改了启动项目,请将其改回来


15
uninstall-package newtonsoft.json -force
install-package newtonsoft.json

这对我起了作用 :)


1
这对我也起作用了。 它自动更新了webconfig文件到正确的版本。 - Shaakir
我也是,这确实有帮助。 - Mike Malter
其他答案对我没有用,但是这个有用!它自动更新了web.config和packages.config,谢谢 :) - jet_choong

13

如果您在同一解决方案中使用多个项目并且其中一个项目使用了库,请检查所有项目是否具有相同版本的Newtonsoft.Json。


这是我的问题。在阅读了上面所有的回复并没有得到结果后,我感到非常沮丧。最终,在我费心检查了生成文件夹中.dll版本时,我才找到了解决方法。 - user2836056

11

从项目引用中移除Newtonsoft.Json程序集,然后再次添加它。您可能意外删除或替换了dll文件。


这种方法适用于我放弃 NuGet 包并重新添加它的 Xamarin Forms iOS 项目。谢谢。 - The Senator

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