繁体   English   中英

无法在单元测试中加载文件或程序集“Newtonsoft.Json,Version = 6.0.0.0”

[英]Could not load file or assembly 'Newtonsoft.Json, Version=6.0.0.0 in unit test

我正在尝试对依赖于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 Update 3
  • 转到文件 - >新建 - >项目
  • 选择Templates-> Visual C# - > Test - > Unit Test Project
  • 右键单击项目,选择属性,然后将框架更改为.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

所以,我得到了测试项目。 我不确定具体是什么让它起作用,因为我尝试了很多东西,但我猜它是这两件事的组合:

清除nuget缓存,如下所述: 如何使用命令行清除NuGet包缓存?

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

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

从我使用packages.config paradigm而不是project.json的项目中复制bindingredirects。

<?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文件夹,并且手动删除该文件夹似乎有所帮助。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM