无法加载文件或程序集'Newtonsoft.Json,在单元测试中版本=6.0.0.0

本文关键字:单元测试 版本 Json Newtonsoft 文件 加载 程序集 | 更新日期: 2023-09-27 18:15:45

我正试图对一个依赖Json的项目进行单元测试。网络和信号。由于某些原因,我无法让许多单元测试运行起来。自从我更新了Json。Net到9.0.0版本,我得到一个异常,说:

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

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


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

  • 使用Visual Studio 2015 Update 3
  • 进入File->New->Project
  • 选择模板->Visual c# ->测试->单元测试项目
  • 右键单击项目,选择属性,将框架更改为。. NET Framework 4.6.1
  • 在项目的根目录创建一个名为project.json的新文件
  • 设置项目的内容。将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(由scaffolding提供)更改为:

.

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的早期版本。净

无法加载文件或程序集'Newtonsoft.Json,在单元测试中版本=6.0.0.0

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

清除nuget包缓存,说明如下:如何使用命令行清除nuget包缓存?

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

接下来,打开命令提示符,将cd放到nuget.exe下载到的目录。

…您可以使用以下命令清除所有缓存:
nuget locals all -clear

从我使用这些包的项目中复制bindingredirects。配置范例代替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,所有的问题都解决了。这个故事的寓意是:试图解决依赖是痛苦的。

Update:在其他项目中有一些类似的经验之后,似乎选择clean from VS并不总是完全清理bin'debug文件夹,手动删除该文件夹似乎有所帮助。

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

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

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

我以前遇到过类似的问题,解决方案是将版本合并到一个库中。您可以右键单击解决方案,然后单击"Manage NuGet Packages for solution"。这将允许您选择要为依赖于此库或任何其他库的解决方案下的项目使用哪个版本。