Azure Function, EF Core, Can't load ComponentModel.Annotations 4.2.0.0

假装没事ソ 提交于 2019-12-03 16:07:30

问题


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


回答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;
    }

}



回答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.




回答3:


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




回答4:


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.




回答5:


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!