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 文件中添加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)-驼峰式属性名称
Azure Functions .NET Core 中的 EF Core 2.0 连接字符串
Azure 静态 Web 应用 Blazor WASM .Net Core API 和标识 - 无法从“_configuration”加载设置