Could not load file or assembly 'System.ComponentModel.Annotations, Version=4.1.0.0
Solution 1:
In many cases, this can be solved by adding the following code to the csproj file of your test project:
<PropertyGroup>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>
This forces the build process to create a .dll.config
file in the output directory with the needed binding redirects.
The reason is that "classic" csproj test projects are true "libraries" and are not considered to need binding redirects by default. But running unit tests requires this. This only becomes an issue if referenced projects need those redirects to work correctly. This usually works when directly installing all NuGet packages that the referenced library uses, but with the new PackageReference
style of NuGet packages, it does not.
See other instances where this fix has helped:
Could not load file or assembly Microsoft.Extensions.DependencyInjection.Abstractions, Version=1.1.0.0
When using .Net Standard 1.4 in a library and .Net framework 4.6.1 in and application, unable to load file System.IO.FileSystem, Version=4.0.1.0
Solution 2:
I had similar problem but none of the above answers helped me. It turns out that solution is very easy, I've just run following command in Package Manager:
Install-Package System.ComponentModel.Annotations -Version 4.1.0
Solution 3:
In my case, I was using 4.0.0, so I fixed it by adding in
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel.Annotations"
publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="4.1.0.0" newVersion="4.0.0.0"/>
</dependentAssembly>
Adapt to your required version.
Solution 4:
This usually happens when visual studio can't figure out the correct bindingRedirect.
Most likely the cause it that the version of the nugget does not match the version of the produced library.
To fix do this:
-
From package manage console do:
Get-Project –All | Add-BindingRedirect
to regenerate
assemblyBinding
configuration at the config file -
If didn't fix it, then add manually the binding redirection:
<dependentAssembly> <assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-X" newVersion="Y" /> </dependentAssembly>
where:
- X is the version that can't be load, from the error message
- Y is the version on your project references. To get it, select the library from the references node, and look for the version on property pane.
Solution 5:
Got it working by using assembly redirection as described in:
just invoke FunctionsAssemblyResolver.RedirectAssembly()
in the begining of your program.
https://stackoverflow.com/a/50776946/2705777
using System.Reflection;
using System.Diagnostics;
using System.Linq;
public class FunctionsAssemblyResolver
{
public static void RedirectAssembly()
{
var list = AppDomain.CurrentDomain.GetAssemblies().OrderByDescending(a => a.FullName).Select(a => a.FullName).ToList();
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
}
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
var requestedAssembly = new AssemblyName(args.Name);
Assembly assembly = null;
AppDomain.CurrentDomain.AssemblyResolve -= CurrentDomain_AssemblyResolve;
try
{
assembly = Assembly.Load(requestedAssembly.Name);
}
catch (Exception ex)
{
}
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
return assembly;
}
}