【问题标题】:Azure Function, EF Core, Can't load ComponentModel.Annotations 4.2.0.0Azure 函数,EF Core,无法加载 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 文件夹吗?

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


【解决方案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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-09
        相关资源
        最近更新 更多