Azure 函数,EF Core,无法加载 ComponentModel.Annotations 4.2.0.0

Posted

技术标签:

【中文标题】Azure 函数,EF Core,无法加载 ComponentModel.Annotations 4.2.0.0【英文标题】:Azure Function, EF Core, Can't load ComponentModel.Annotations 4.2.0.0 【发布时间】:2018-05-15 04:38:25 【问题描述】:

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

转到 azure 函数,并得到以下运行时错误:

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

我正在使用 Visual Studio 15.7.0 预览版 5.0。我已将 Azure Function 更新到 4.7...,因为控制台和测试项目是 - 并且这些工作正常。

在这方面待了太多小时......所以我希望这个决议不是什么疯狂的事情。 Ef Core 2.1.0-rc1-final 也在其中。对Required、MaxLength、NotMapped 使用数据注解。

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

【问题讨论】:

尝试在你的 csproj 文件中添加 truetrue 你的函数是什么版本,v1还是v2? 不知道如何区分V1或V2,只是通过VS 2017创建了它。项目中的Property Group也没有做任何事情。 Azure Functions 项目的目标框架是什么?正如您提到的 I have updated the Azure Function to 4.7,我假设您的目标是 .NET Framework 4.7,这是关于 Azure Functions V1。我还创建了我的 Net Standard 2.0 类库并创建了我的 DbContext,我在 Azure Functions V1(.net 框架)和 Azure Functions V2(.net 核心)项目下都引用了它,我发现这两个项目都可以按预期工作。跨度> 您能分享您的.csproj 文件或显示bin 文件夹吗? 【参考方案1】:

我建议在启动 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;
    


【讨论】:

太好了,成功了!但是,我想这会对我想的同一个功能应用程序中的每个功能产生影响? 我不清楚你是如何运行它的。我已经尝试将它作为函数Run(...) 方法的第一行,并在函数类的静态构造函数中,但它似乎在构建过程中没有被调用? 是的,这正是我正在做的——在 Run(...) 或构造函数上运行它。它不应该在构建期间被调用,这是一个运行时问题,所以它只会被调用。 注意:这只会重定向安装在调用该方法的项目中的包。例如,如果您在“服务”项目中调用 FunctionsAssemblyResolver.RedirectAssembly(),它不会更改“基础设施”项目中的包,即使它们是作为参考添加的。话虽如此,谢谢!我已经为这个愚蠢的问题尝试了很多解决方案,这是一个有效的解决方案。【参考方案2】:

我按照这里的说明进行操作:

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。

【讨论】:

注意重要提示。有多个版本实际上是 AssemblyVersion 4.2.1.0 你的笔记救了我的命!我更改了 web.config 中的绑定重定向,一切正常。非常感谢。【参考方案3】:

如果被误用,接受的响应将由于+= 导致 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 方法。

【讨论】:

【参考方案4】:

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

Install-Package System.ComponentModel.Annotations -Version 4.5.0

由于 ComponentModel 还没有发布 4.2.0.0,所以尝试安装最新版本。参考:-

Neget Gallery

【讨论】:

【参考方案5】:

我遇到了同样的问题,我最终将 Microsoft.EntityFrameworkCore 包降级到版本 2.0.3,它依赖于 System.ComponentModel.Annotations 4.4.0,这是 Microsoft.NET 的包。 SDK.Functions 1.0.14 需要。如果您对 System.ComponentModel.Annotations 4.5.0 或更高版本有显式依赖,则还需要将其降级到 4.4.0。

【讨论】:

以上是关于Azure 函数,EF Core,无法加载 ComponentModel.Annotations 4.2.0.0的主要内容,如果未能解决你的问题,请参考以下文章

Azure 函数 V3 无法使用 EF 核心 5.0-rc1 加载文件或程序集 Microsoft.Extensions.DependencyInjection.Abstractions,版本 = 5

使用 Azure MSI 的身份服务器 EF Core DB 配置

Azure Cosmos DB(EF/Core)-驼峰式属性名称

无法加载EF Core中的 "一对多 "导航属性。

Azure Functions .NET Core 中的 EF Core 2.0 连接字符串

Azure 静态 Web 应用 Blazor WASM .Net Core API 和标识 - 无法从“_configuration”加载设置