Azure Function, EF Core, Can't load ComponentModel.Annotations 4.2.0.0
I have created several .Net Standard 2.0 libraries, tested the execution via a console application, as well as several tests - all is good.
Move over to azure function, and get the following run-time error:
I then try to download that specific version into the API Function project:
I'm using Visual Studio Version 15.7.0 Preview 5.0. I have updated the Azure Function to 4.7... as the console and test projects are - and those work.
Been at this a far too many hours.. so I'm hoping the resolution isn't something crazy. Ef Core 2.1.0-rc1-final is also in the mix. Using data annotations for Required, MaxLength, NotMapped.
Error in graphic says: Microsoft.EntityFrameworkCore: Could not load file or assembly 'System.ComponentModel.Annotations, Version=4.2.0.0
Solution 1:
I would suggest running this function below once you start your Azure Function. It will redirect any assembly to an existing version.
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;
}
}
Solution 2:
I followed the instructions here:
https://codopia.wordpress.com/2017/07/21/how-to-fix-the-assembly-binding-redirect-problem-in-azure-functions/
And added the following redirect:
"BindingRedirects": "[ { "ShortName": "System.ComponentModel.Annotations", "RedirectToVersion": "4.2.1.0", "PublicKeyToken": "b03f5f7f11d50a3a" } ]"
NOTE: Its not v 4.5.0.0 ... Its actually 4.2.1.0.
Solution 3:
The accepted response will cause a CPU leak due to the +=
if it is misused, and will grind your function app to a halt. If you are using IoC, it is better to use a singleton. Here:
public class FunctionsAssemblyResolver
{
static FunctionsAssemblyResolver()
{
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
}
// At least one static member needs to be invoked in order to execute the static constructor,
// but it will only run the constructor once.
public static void StaticInstance() { }
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
var requestedAssembly = new AssemblyName(args.Name);
try
{
// Feel free to resolve any other assemblies, but this will take care of Annotations
return requestedAssembly.Name == "System.ComponentModel.Annotations"
? Assembly.Load(requestedAssembly.Name)
: null;
}
catch
{
// do nothing
}
return null;
}
}
To use, just call FunctionsAssemblyResolver.StaticInstance()
prior to any IoC resolves. This can also be used for any non-IoC approach as well.
Solution 4:
Add the latest ComponentModel reference into your project using nuget command from Package Manager Console will solve this issue for all type application (Console/Web/Azure).
Install-Package System.ComponentModel.Annotations -Version 4.5.0
Since ComponentModel has not a release of 4.2.0.0 that's why try to install the latest on. Reference: -
Neget Gallery