无法加载文件或程序集“Newtonsoft.Json,版本=4.5.0.0,文化=中性,PublicKeyToken=30ad4fe6b2a6aeed”

Posted

技术标签:

【中文标题】无法加载文件或程序集“Newtonsoft.Json,版本=4.5.0.0,文化=中性,PublicKeyToken=30ad4fe6b2a6aeed”【英文标题】:Could not load file or assembly 'Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' 【发布时间】:2014-04-25 18:37:52 【问题描述】:

我收到错误消息

System.IO.FileLoadException:无法加载文件或程序集 'Newtonsoft.Json,版本=4.5.0.0,文化=中性, 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 库。 Do you have it installed? 完全相同的问题 - 让我发疯。如果您找到解决方案,请告诉我 实际上,对我来说,添加您尝试的方法解决了问题。 使用 NuGet 包管理器中的合并选项确保版本不会分开。 这是唯一对我有用的东西:github.com/Redth/PushSharp/issues/361#issuecomment-181387928 【参考方案1】:

从项目引用中删除 Newtonsoft.Json 程序集并再次添加。您可能不小心删除或替换了 dll。

【讨论】:

这种方法适用于 Xamarin Forms ios 项目,我在该项目中删除了 NuGet 包并重新添加了它。谢谢。【参考方案2】:

将正确的版本部署到 CI 机器上

这告诉您程序集加载器找到了不同版本的 Newtonsoft.Json 程序集,它与您在项目中创建的引用不匹配。要正确加载程序集,您必须将程序集与已编译的代码并排部署,或者在目标计算机(即 GAC 中)安装正确版本的程序集。

替代方案:确保配置在正确的文件中

如果您想保留当前解决方案并加载具有不同版本的程序集,请确保您发布的配置位于正确的 .config 文件中。请记住,没有xpto.dll.config,应用程序加载的 DLL 始终使用正在运行的应用程序的配置文件。

【讨论】:

【参考方案3】:

就我而言,在下载程序集并添加对项目的引用后,我通过在添加对项目的引用之前“解锁”DLL 解决了这个问题。

使用 Windows 资源管理器,浏览到 DLL 位置,右键单击 DLL,然后选择“属性”。您会在其中一个选项卡上找到一个“取消阻止”按钮,然后您可以添加引用并且程序集将正确加载。

【讨论】:

【参考方案4】:

我认为您指向错误的目标,将其更改为 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>

这应该可行。

【讨论】:

Umbraco 7 需要 4.5.0.0,所以这有助于启动和运行【参考方案5】:

我们遇到了与您提到的完全相同的问题。我们使用 nunit 通过 CI 运行测试,我们让 nunit 运行一个名为 tests.nunit 的文件,该文件描述了要运行的测试 dll 固定装置的列表。

每个测试夹具都有自己的配置文件,但是当通过“tests.nunit”文件运行时,绑定重定向似乎被忽略了。解决方案是将绑定重定向添加到“tests.nunit”文件旁边的新配置文件“tests.config”。

【讨论】:

你能详细说明一下吗?【参考方案6】:

在包管理器控制台中执行:Update-Package –reinstall Newtonsoft.Json

更新

我最初将此作为评论发布,但正如 @OwenBlacker 建议的那样,我将其放在这里:

如果您在执行此操作后仍然出现错误,那么最终对我有用的是我从我的 .config 文件中删除了 Json.Net 的 &lt;dependentAssembly&gt; 部分。如果它不存在,则重新安装会将其恢复,显然您需要将其删除。直到包本身有正常的解决方案,恐怕这个手动步骤是必须的。

注意:请在执行此操作之前阅读下面的 cmets。

根据 René 在下面 BE AWARE 的评论,答案中发布的命令将在您的解决方案中的每个项目中重新安装包。因此,如果您在多个项目中使用 Newtonsoft.Json 包并且可能使用不同的版本,则仅执行上述命令可能会产生不良后果。

【讨论】:

为了大家阅读本文:我已经这样做了,但仍然出现错误。然后我以某种方式解决了它:令人惊讶的是,我不得不从我的.config 文件中删除 Json.Net 的&lt;dependentAssembly&gt; 部分。如果它不存在,则重新安装会将其恢复,显然您需要将其删除。直到包本身有正常的解决方案,恐怕这个手动步骤是必须的。 @OferZelig 您应该将其作为单独的答案发布,以便获得赞成票(更重要的是,增加关注度)。尤其是因为它也对我有用:) @OwenBlacker 谢谢。但是因为已经有很多答案,我的会迷路。这个答案很好,只是如果它不起作用,那么我的评论“完成”了它。你知道吗?我想我只会编辑原始答案。比获得自己的声望更重要。 请注意答案中发布的命令将在您的解决方案中的每个项目中重新安装包。因此,如果您在多个项目中使用 Newtonsoft.Json 包并且可能使用不同的版本,则仅执行上述命令可能会产生不良后果。 解决了!对我来说,我在一个项目中安装了 v6,从包管理器重新安装将其升级到 v7。【参考方案7】:

您应该更新服务器中的 web.config 文件。 当 nuget 安装 NewtonSoft 时更新此文件,包括此代码

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

【讨论】:

在我的情况下,这正是我的解决方案,放入 app.config。 “程序集版本可以在应用程序、发布者策略或机器配置文件中重定向。”【参考方案8】:

对于 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://***.com/a/12011221/150370 中所建议的那样)。否则,assemblyBinding 标签将被忽略。

【讨论】:

对我来说,在我应用此答案后,清理后手动删除 bin 文件夹的内容(不会清空它)就可以了。 非常感谢! :) 效果很好!截至 2015 年 7 月 4 日,Newtonsoft.Json 的当前版本为 7.0.0,因此必须将 newVersion="6.0.0.0" 更改为 newVersion="7.0.0.0" 或您使用的任何版本 命名空间上的那个注释...我可以拥抱你。我为此花费了几个小时,不知道绑定重定向因此被忽略了。 关于命名空间的注释非常重要,它可以作为自己的答案。非常感谢。【参考方案9】:

对我来说,问题是 Newtonsoft.Json 的贬值版本。重新安装没有帮助。

在 Visual Studio 中,转到工具->管理 NuGet 包。选择更新。搜索牛顿软件。点击更新安装最新版本。

【讨论】:

最新版本并不总是正确的方法 - 对我们来说,v6 打破了一些在 v4 中运行良好的继承序列化。 如果您遇到副作用,您可以随时恢复到旧版本。【参考方案10】:

我错误地为 .Net 4.5 添加了 NewtonSoft .dll 文件。

我的主要项目 4.5,但是当我在我的解决方案中添加一个额外的项目时,它奇怪地将它添加为一个 .Net 2.0 项目......当我尝试使用 NewtonSoft 的 4.5 dll 时这个,我得到了这个“找不到Newtonsoft.Json”的错误。

解决方案(当然)是将这个新项目从 .Net 2.0 更改为 4.5。

【讨论】:

【参考方案11】:

我对这里提供的任何解决方案(卸载、重新安装、删除引用、创建 bindingRedirects 等)都不满意。我不得不回到旧版本的 Newtonsoft。版本 5.0.6 之前一直在工作,所以我尝试了那个。我必须在 Package Console 中输入这两个命令:

uninstall-package newtonsoft.json -force

install-package newtonsoft.json -version "5.0.6"

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

【讨论】:

工作就像一个魅力。在我的 MVC 4 项目中有错误。几乎切换到本机序列化程序。 谢谢,我只需要将 -version "5.0.6" 更改为 -pre: install-package newtonsoft.json -pre【参考方案12】:

通常添加绑定重定向应该可以解决这个问题,但它对我不起作用。经过几个小时的头撞墙后,我意识到有一个 xmlns 属性导致我的 web.config 出现问题。从 Web.config 中的配置节点中删除 xmlns 属性后,绑定重定向按预期工作。

http://www.davepaquette.com/archive/2014/10/02/could-not-load-file-or-assembly-newtonsoft-json-version4-5-0-0.aspx

【讨论】:

【参考方案13】:

我修复了将此绑定重定向添加到我的 .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 您的代码 sn-p 让我意识到缺少“assemblyBinding”元素。谢谢【参考方案14】:

上面没有任何帮助我,但实际上修复它的是以下内容:

    移除 app.config 中的所有依赖绑定(从解决方案中的所有 app.config 文件中) 从“包管理器控制台”执行以下命令

获取项目 -All |添加绑定重定向

    重建

参考: http://blog.myget.org/post/2014/11/27/Could-not-load-file-or-assembly-NuGet-Assembly-Redirects.aspx

【讨论】:

【参考方案15】:

此外,在使用 NuGet 还原的 CI 环境中,请确保您没有将部分文件夹签入源代码管理。默认情况下,将文件夹添加到源代码管理时,它会自动排除程序集。此外,这违背了在构建时恢复 nuget 包的整个目的。检查程序集或不签入任何包文件夹都会成功构建,但更好的做法是不要将 nuget 包签入源代码管理。

【讨论】:

【参考方案16】:

我遇到了同样类型的问题。而且我还解决了它,只是执行以下操作: 转到 TOOLS > NuGet Package Manager 并选择 Package Manager Console 。最后,执行以下两条命令:)

    卸载包 newtonsoft.json -force 安装包 newtonsoft.json

【讨论】:

【参考方案17】:
uninstall-package newtonsoft.json -force
install-package newtonsoft.json

帮我搞定了:)

【讨论】:

这对我也有用。它会自动将 webconfig 文件更新为正确的版本。 我也是,这真的很有帮助。 其他答案对我不起作用,但这个!它会自动更新 web.config 和 packages.config,谢谢 :)【参考方案18】:

右键单击您的项目选择管理 Nuget 包,在搜索框中输入 newtonsoft 并安装最新版本。然后运行您的应用程序

【讨论】:

【参考方案19】:

我遇到了同样的错误并为此苦苦挣扎了好几个小时。我有一个使用 Newtonsoft.json 的 Web API 项目和另一个用于 Web API 项目的 UnitTest 项目。单元测试项目还需要 Newtonsoft.json 参考。但是在添加链接时,我遇到了上述异常。

我最终通过在单元测试项目的app.config中添加如下代码sn-p解决了:

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

【讨论】:

我在升级 Nestwonsoft.Json 时遇到了同样的问题,同时仍在使用旧版本的 WebAPI,这解决了它。谢谢!【参考方案20】:

我正在编写一个 WebApi REST 服务客户端,所以对我来说,这个错误是由通过添加引用手动添加对 System.Net.HttpSystem.Net.Http.Formatting 程序集的引用引起的,而我应该通过 Microsoft.AspNet.WebApi.Client 包>NuGet。 另见this answer to another question。

【讨论】:

【参考方案21】:

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

步骤;

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)产生了巨大的差异。我会付出更多.....谢谢:) 这对我有用。我将版本更新到 7,但它实际上运行的是版本 8,所以我只是将 newVersion 更改为 8.0,谢谢! 即使安装了 8.0.3(就像它在 nuget 包管理器中所说的那样),引用下的 .dll 仍然是 8.0.0。所以我在 web.config 中改为 8.0.0.0。奇怪的是昨天我发布了所有内容时它是如何工作的,而今天早上它不再工作了。 如何找到参考版本?在重定向中使用 12.0.3.0 不起作用,但 12.0.0.0 可以。如果没有纯粹的侥幸,我怎么会解决这个问题?有详细的地方吗?它无法找到 bin 文件夹中存在的 12.0.3.0,但它可以找到显然不作为版本化程序集存在的 12.0.0.0 哈!【参考方案22】:

在我的例子中,主项目仍然引用旧版本的 Newtonsoft.Json,它不再存在于项目中(显示为黄色感叹号)。删除引用解决了问题,不需要 bindingRedirect。

【讨论】:

【参考方案23】:

我花了几天时间试图解决这个令人沮丧的问题。我已经尝试了几乎所有可以在网络上找到的东西。最后我发现这个错误可能是由一个解决方案中的不同目标.Net项目版本(4.5和4.5.1)引起的(就像我的情况一样)。下面的步骤为我修复了它:

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

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

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

    uninstall-package newtonsoft.json -force

    更新所有packages.config文件中的所有Newtonsoft.Json版本,像这样

    &lt;package id="Newtonsoft.Json" version="7.0.1" targetFramework="net451" /&gt;

    从“包管理器控制台”重新安装Newtonsoft.Json

    install-package newtonsoft.json

    重建解决方案

(可选)7.如果你改变了启动项目,重新返回

【讨论】:

【参考方案24】:

另一个隐蔽的问题是,如果元素在任何其他dependentAssembly 元素上的配置不正确,绑定重定向似乎会默默地失败。

确保每个元素下只有一个元素。

在某些情况下,VS 会生成:

  <dependentAssembly>
    <assemblyIdentity ...
    <assemblyIdentity ...
  </dependentAssembly>

代替

  <dependentAssembly>
    <assemblyIdentity ...
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity ...
  </dependentAssembly>

我花了很长时间才意识到这是问题所在!

【讨论】:

【参考方案25】:

以下部分添加到您的 web.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>

【讨论】:

【参考方案26】:

如果错误在本地消失并且仍然出现在服务器上,我的解决方案是删除 bin 文件夹和 packages.config 和 web.config 并重新上传这些文件

【讨论】:

【参考方案27】:

我在版本 7.0.0.0 上遇到了完全相同的问题,导致我的问题的 lib 是 Microsoft.Rest.ClientRuntime,它在某种程度上指的是 Newtonsoft.json 的错误版本 (6.0.0.0),尽管在 nugget 中进行了正确的依赖管理(安装了正确版本的 newtonsoft.json (7.0.0.0))。

我通过在配置文件中应用上述从 6.0.0.0 到 7.0.0.0(来自 Kadir Can)的重定向解决了这个问题:

<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="7.0.0.0" />

----> 几天后没有更改任何内容,它再次出现同样的错误。我安装了版本 6.0.0.0 n 更新到 7.0.0.0 现在可以正常工作了。

【讨论】:

为我工作。已安装版本 Newtonsoft Json 7.0.1(测试版),但生成的配置指向不正确的 6.0.0.0。谢谢!【参考方案28】:

通过 nuget 重新安装 newtonsoft 包对我不起作用。 我不得不手动调用 JsonConvert.DeserializeObject 来绕过这个问题

我变了

HttpResponseMessage response = await client.GetAsync(url));
response.EnsureSuccessStatusCode();
MyObject data = await response.Content.ReadAsAsync<MyObject>();

对于

HttpResponseMessage response = await client.GetAsync(url));
response.EnsureSuccessStatusCode();
string jsonStr = await response.Content.ReadAsStringAsync();
MyObject data = JsonConvert.DeserializeObject<MyObject>(jsonStr);

【讨论】:

我发现除了直接调用 JsonConvert.DeserializeObject() 之外,还可以从 NuGet 中添加 Microsoft.AspNet.WebApi.Client 包来获取 System.Net 的更新版本。 Http.Formatting。这将允许您使用 response.Content.ReadAsAsync() 调用并让 Json.Net 在幕后工作。 Bioupy,你的建议对我有用。在我的项目中,我们使用 Newtonsoft.Json version=9.0.0.0(作为 NuGet 包)和 Microsoft.AspNet.WebApi.Client version=5.2.3(也作为 NuGet)。 System.Net.Http.Formatting.dll 似乎对版本 = 6.0.0.0 的 Newtonsoft.Json.dll 有严格的版本引用。因此它尝试加载版本 6.0.0.0,但我无法将 2 个不同版本的 2 个 Newtonsoft.Json 程序集放在我的应用程序目标文件夹中。因此,将响应读取为字符串并使用 JsonConvert.DeserializeObject 对其进行反序列化解决了我的情况。【参考方案29】:
<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="7.0.0.0"/>
  </dependentAssembly>
</assemblyBinding>

对我有用....只需将您正在使用的版本放入 newVersion 即(newVersion="7.0.0.0")

【讨论】:

前段时间遇到过这个问题,一键解决。非常感谢。【参考方案30】:

您可以从引用中的属性中找到您的库的安装版本。就我而言,我安装了 8.0.0.0。错误提示Could not load file or assembly 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies.

所以我不得不在 web.config 中手动添加以下内容

  <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
        <bindingRedirect oldVersion="6.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
      </dependentAssembly>

【讨论】:

以上是关于无法加载文件或程序集“Newtonsoft.Json,版本=4.5.0.0,文化=中性,PublicKeyToken=30ad4fe6b2a6aeed”的主要内容,如果未能解决你的问题,请参考以下文章

无法加载文件或程序集 'PayPalAdaptivePaymentsSDK,版本 = 2.12.117.0

无法加载文件或程序集。找到的程序集的清单定义与程序集引用不匹配

无法加载文件或程序集'netstandard,版本 = 2.0.0.0

无法加载文件或程序集 此处的程序集名称 或其依赖项之一。访问被拒绝

无法加载文件或程序集或其依赖项之一

寻找解决策略:无法加载文件或程序集[重复]