Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 385
Sam I am says Reinstate Monica Avatar asked Oct 31 '16 16:10

Sam I am says Reinstate Monica


2 Answers

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.

like image 188
Sam I am says Reinstate Monica Avatar answered Oct 01 '22 21:10

Sam I am says Reinstate Monica


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.
like image 26
UtopiaLtd Avatar answered Oct 01 '22 21:10

UtopiaLtd