Azure功能,EF Core,无法加载ComponentModel.Annotations 4.2.0.0

时间:2018-05-15 04:38:26

标签: c# entity-framework-core azure-functions

我创建了几个.Net Standard 2.0库,通过控制台应用程序测试了执行,以及几个测试 - 一切都很好。

切换到azure函数,并获得以下运行时错误: enter image description here

然后我尝试将该特定版本下载到API Function项目中: enter image description here

我使用的是Visual Studio 15.7.0预览版5.0。我已经将Azure功能更新为4.7 ...因为控制台和测试项目是 - 并且那些工作。

这是一个太多的小时..所以我希望这个决议不是什么疯狂的事情。 Ef Core 2.1.0-rc1-final也在混合中。使用Required,MaxLength,NotMapped的数据注释。

图形错误说:  Microsoft.EntityFrameworkCore:无法加载文件或程序集' System.ComponentModel.Annotations,Version = 4.2.0.0

5 个答案:

答案 0 :(得分:17)

我建议您在启动Azure功能后运行此功能。它会将任何程序集重定向到现有版本。

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

}

答案 1 :(得分:8)

我按照这里的说明操作:

https://codopia.wordpress.com/2017/07/21/how-to-fix-the-assembly-binding-redirect-problem-in-azure-functions/

并添加了以下重定向:

"BindingRedirects": "[ { "ShortName": "System.ComponentModel.Annotations", "RedirectToVersion": "4.2.1.0", "PublicKeyToken": "b03f5f7f11d50a3a" } ]"

注意:它不是v 4.5.0.0 ......实际上是4.2.1.0。

答案 2 :(得分:1)

我遇到了同样的问题,最终我要做的是将Microsoft.EntityFrameworkCore程序包降级到2.0.3版,该程序包依赖于System.ComponentModel.Annotations 4.4.0,后者是Microsoft.NET的程序包。 SDK功能1.0.14要求。如果您对System.ComponentModel.Annotations 4.5.0或更高版本有明确的依赖性,则还需要将其降级为4.4.0。

答案 3 :(得分:1)

使用Package Manager控制台中的nuget命令将最新的ComponentModel引用添加到您的项目中,将为所有类型的应用程序(控制台/ Web / Azure)解决此问题。

Install-Package System.ComponentModel.Annotations -Version 4.5.0

由于 ComponentModel 尚未发布 4.2.0.0 ,这就是尝试安装最新版本的原因。参考:-

Neget Gallery

答案 4 :(得分:1)

如果+=被滥用,则可接受的响应将导致CPU泄漏,并使功能应用程序停止运行。如果您使用的是IoC,则最好使用单例。在这里:

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

要使用,只需在任何IoC解析之前调用FunctionsAssemblyResolver.StaticInstance()。这也可以用于任何非IoC方法。