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
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;
}
}
I followed the instructions here:
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.
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: -
I had the same problem and what I ended up doing was to downgrade the Microsoft.EntityFrameworkCore package to version 2.0.3 which has a dependency on System.ComponentModel.Annotations 4.4.0 which is the package that the Microsoft.NET.Sdk.Functions 1.0.14 requires. If you have an explicit dependency on System.ComponentModel.Annotations 4.5.0 or greater you need to downgrade that to 4.4.0 as well.
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.
来源:https://stackoverflow.com/questions/50342416/azure-function-ef-core-cant-load-componentmodel-annotations-4-2-0-0