Reputation: 31194
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:
.
{
"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": {}
}
}
.
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace UnitTestProject1
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
var conman = Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager;
}
}
}
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
Upvotes: 8
Views: 15511
Reputation: 33
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.
Upvotes: 0
Reputation: 31194
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 whichnuget.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.
Upvotes: 4
Reputation: 2590
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:
Upvotes: 1