【问题标题】:Could not load file or assembly 'Newtonsoft.Json, Version=6.0.0.0 in unit test无法在单元测试中加载文件或程序集'Newtonsoft.Json,版本 = 6.0.0.0
【发布时间】:2017-03-13 18:50:17
【问题描述】:

我正在尝试对依赖于 Json.Net 和 SignalR 的项目进行单元测试。由于某种原因,我无法运行许多这些单元测试。自从我将 Json.Net 更新到 9.0.0 版后,我收到一个异常消息:

在 mscorlib.dll 中发生了“System.IO.FileLoadException”类型的异常,但未在用户代码中处理

附加信息:无法加载文件或程序集“Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)


我可以用一个干净的项目重现这种行为。以下是重现的步骤:

  • 使用 Visual Studio 2015 更新 3
  • 转到文件->新建->项目
  • 选择模板->Visual C#->测试->单元测试项目
  • 右键项目,选择属性,将框架改为.NET Framework 4.6.1
  • 在项目的根目录下创建一个名为 project.json 的新文件
  • project.json的内容设置为:

.

{
  "dependencies": {
    "Microsoft.AspNet.SignalR.Client": "2.2.1",
    "Microsoft.AspNet.SignalR.Core": "2.2.1",
    "Newtonsoft.Json": "9.0.1"
  },
  "frameworks": {
    "net451": {},
    "net461": {}
  },
  "runtimes": {
    "win": {},
    "win-x86": {},
    "win-x64": {}
  }
}
  • UnitTest1.cs(由脚手架提供)更改为以下内容:

.

using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UnitTestProject1
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var conman = Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager;
        }
    }
}
  • 关闭并重新打开 Visual Studio(这是使用 project.json 加载依赖项所必需的)
  • 重建项目
  • 选择测试方法,按CTRL+R+T

应该会出现错误。

我不知道如何解决这个问题。我尝试过使用绑定 bindingRedirects,但没有什么能让错误消失。重新安装包没有任何意义,因为我可以用一个干净的项目重现它。

我担心我将不得不恢复到 Json.Net 的早期版本

【问题讨论】:

  • 那是 Json.NET 的非常老的版本。将旧版本添加到您的测试项目或升级所有项目以使用相同的版本。您是否检查过 NuGet 包管理器中的“更新”或“合并”选项卡?
  • 同时检查对 Json.NET 的直接引用,即不通过 NuGet
  • @PanagiotisKanavos 我正在用一个干净的项目在一个全新的解决方案中重现这个,除了单元测试之外什么都没有。
  • ASP.NET 模板不包含最新的 Json.NET 引用。发生错误是因为 web 应用 引用了旧的 Json.NET 版本。删除任何现有的非 Nuget 引用并将包添加到所有项目。我过去遇到过同样的问题
  • 模板也可能使用 JSON.NET 的 GAC 引用。这就是为什么你应该检查现有的引用,然后确保你只使用 NuGet

标签: c# unit-testing visual-studio-2015 json.net signalr


【解决方案1】:

所以,我开始运行测试项目。由于我尝试了多种方法,因此我不完全确定是什么使它起作用,但我猜这是这两件事的结合:

按照此处所述清除 nuget 缓存:How to clear NuGet package cache using command line?

首先,从here下载nuget命令行工具。

接下来,打开命令提示符并将cd 转到下载nuget.exe 的目录。
...
您可以使用以下命令清除所有缓存:
nuget locals all -clear

从我使用 packages.config 范例而不是 project.json 的项目复制绑定重定向。

<?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-9.0.0.0" newVersion="9.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

更新:我有其他项目,包括 UWP 项目,也有加载 Newtonsoft.Json 的问题。最后,我只是恢复到 7.0,我所有的问题都解决了。故事的寓意:试图解决依赖关系是痛苦的。

更新:在其他项目中的一些类似经历之后,似乎从 VS 中选择 clean 并不总是完全清除 bin\debug 文件夹,手动删除该文件夹似乎有帮助。 p>

【讨论】:

    【解决方案2】:

    有时 Newtonsoft.Json(毫无帮助)会出现在全局程序集缓存 (GAC) 中,除非它在该目录中本地提供,否则它将胜过您要求的任何版本。检查您的测试项目的引用并找到对 Newtonsoft.Json 的引用:

    • 确保引用的 Copy Local 值设置为 True
    • 确保引用指向解决方案的 /packages 文件夹中正确的 NuGet DLL,而不是其他位置。

    【讨论】:

    • 引用没有“复制本地”值。事实上,它根本没有任何属性。似乎这与使用 project.json 将其定义为依赖项有关。
    • 那么引用有一个 NuGet 图标,对吧?单元测试目录本身是否有 Newtonsoft.Json.dll?如果是这样,如果您在 Windows 文件资源管理器中打开它的属性,它会报告什么版本?如果您不知何故并未真正使用更新 3,您可以尝试将 &lt;CopyNuGetImplementations&gt;true&lt;/CopyNuGetImplementations&gt; 添加到 .csproj 文件中的新 PropertyGroup,但据说更新 1 已修复此问题。
    • bin/debug目录下的Newtonsoft.dll文件版本为9.0.1.19813
    • 如果您还有其他问题,我已经提供了用干净的项目重现此问题的完整步骤,以便您自己体验问题。
    • 对,我跟着那些,没有发生任何事故。此时,您的测试运行程序的工作目录似乎不是真正的 bin 文件夹,它仍在从 GAC 中提取,或者绑定重定向不起作用。简单的做法就是将其从您的 GAC 中删除,但如果这要发送给客户,显然这是不合适的。
    【解决方案3】:

    您的项目(单元测试项目和目标项目)中的程序集之间似乎存在差异。

    我之前遇到过类似的问题,解决方案是将版本整合到一个库中。 您可以通过右键单击您的解决方案然后“管理解决方案的 NuGet 包”来执行此操作。 这将允许您选择要用于依赖此库或任何其他库的解决方案下的项目的版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-15
      • 2015-12-18
      • 2023-01-20
      • 2016-06-05
      • 2011-09-04
      • 2015-12-23
      • 2020-10-27
      相关资源
      最近更新 更多