简体   繁体   中英

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

I am trying to unit test a project that has dependencies on Json.Net and SignalR. For some reason I am unable to get many of these unit tests to run. Ever since I've updated Json.Net to version 9.0.0, I am getting an exception that says:

An exception of type 'System.IO.FileLoadException' occurred in mscorlib.dll but was not handled in user code

Additional information: Could not load file or assembly 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)


I can reproduce this behavior with a clean project. Here are the steps to reproduce:

  • Use Visual Studio 2015 Update 3
  • Go to File->New->Project
  • Select Templates->Visual C#-> Test -> Unit Test Project
  • Right click the project, select properties, and change the framework to .NET Framework 4.6.1
  • create a new file at the root of the project named project.json
  • Set the content of project.json to the following:

.

{
  "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": {}
  }
}
  • Change UnitTest1.cs (provided by the scaffolding) to the following:

.

using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UnitTestProject1
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var conman = Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager;
        }
    }
}
  • Close and reopen visual studio(this is necessary to load the dependencies using project.json)
  • Rebuild the project
  • select the test method, and press CTRL+R+T

The error should appear.

I have no idea how to fix this. I've tried playing around with the binding bindingRedirects, and nothing has made the error go away. Reinstalling the package doesn't make any sense, because I can reproduce this with a clean project.

My fear is that I'll have to revert back to an earlier version of Json.Net

So, I got the test project to run. I'm not entirely sure what specifically got it to work since i tried multiple things, but I'm guessing it was a combination of these two things:

clearing the nuget cache as described here: How to clear NuGet package cache using command line?

First, download the nuget command line tool from here .

Next, open a command prompt and cd to the directory to which nuget.exe was downloaded.
...
You can clear all caches with this command:
nuget locals all -clear

copying the bindingredirects from a project where I used the packages.config paradigm instead of 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>

Update: I had other projects, including UWP projects, that were also having issues loading Newtonsoft.Json. In the end, I just reverted back to 7.0, and all my issues went a way. Moral of the story: Trying to resolve dependencies is pain.

Update: After some similar experiences in other projects It seems as though selecting clean from VS isn't always fully cleaning the bin\\debug folder, and manually deleting that folder seems to help.

Sometimes Newtonsoft.Json (unhelpfully) winds up in the Global Assembly Cache (GAC) and it will trump whatever version you're asking for unless it's provided locally in that directory. Check the references of your test project and find the reference to Newtonsoft.Json:

  • Make sure the reference's Copy Local value is set to True .
  • Make sure the reference is pointed at the correct NuGet DLL in your solution's /packages folder rather than somewhere else.

It seems that there is an divergence between assemblys in your projects (unit test project and target project).

I've faced an similar issue before and the solution was to consolidate the versions into one library. You can do this by right clicking your solution and then "Manage NuGet Packages for Solution". This will let you choose what version you want to use for the projects under your solution that dependes on this or any other library.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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