Azure 函数 V3 无法使用 EF 核心 5.0-rc1 加载文件或程序集 Microsoft.Extensions.DependencyInjection.Abstractions,版本 = 5
Posted
技术标签:
【中文标题】Azure 函数 V3 无法使用 EF 核心 5.0-rc1 加载文件或程序集 Microsoft.Extensions.DependencyInjection.Abstractions,版本 = 5.0.0.0【英文标题】:Azure function V3 could not load file or assembly Microsoft.Extensions.DependencyInjection.Abstractions, Version=5.0.0.0 with EF core 5.0-rc1 【发布时间】:2021-01-06 09:08:52 【问题描述】:案例
我们正在使用 .netcore 3.1 创建 azure function v3。使用 EF core 5.0-rc1 和 依赖注入
1) 依赖注入
[assembly: FunctionsStartup(typeof(xxxxx.Startup))]
namespace xxxxx
public class Startup : FunctionsStartup
public override void Configure(IFunctionsHostBuilder builder)
var services = builder.Services;
var configBuilder = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddJsonFile("local.settings.json", true, reloadOnChange: true)
.AddEnvironmentVariables() ;
ConfigureServices(services);
ConfigureAppSettings(services, configBuilder.Build());
ConfigureLogging(services, configBuilder.Build());
2) EF 核心 5.0 rc-1
https://devblogs.microsoft.com/dotnet/announcing-entity-framework-core-efcore-5-0-rc1/
错误
无法加载文件或程序集“Microsoft.Extensions.DependencyInjection.Abstractions,Version=5.0.0.0,Culture=neutral,PublicKeyToken=adb9793829ddae60”。系统找不到指定的文件。
包
以下是引用的包
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<AzureFunctionsVersion>v3</AzureFunctionsVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="4.1.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="5.0.0-rc.1.20451.14" />
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.7" />
<PackageReference Include="Serilog.Extensions.Logging" Version="3.0.1" />
<PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" />
</ItemGroup>
<ItemGroup>
<None Update="host.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="local.settings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</None>
</ItemGroup>
</Project>
疑难解答
在 startup.cs 中注释以下行(依赖注入)可以解决问题
[assembly: FunctionsStartup(typeof(xxxxx.Startup))]
【问题讨论】:
.NET 5 在 Azure Functions V3 中不受支持。它位于 Azure Functions 路线图 - github.com/Azure/azure-functions-host/issues/6674 【参考方案1】:Microsoft.Azure.Functions.Extensions
取决于 .net 标准 2.0。
虽然 Entity Framework Core 5.0 RC1 不能在 .Net 标准 2.0 平台上运行,但它需要 .net 标准 2.1。所以找不到Microsoft.Azure.Functions.Extensions
。
更多详情可以参考这个article。
【讨论】:
.NET Core 3.1 支持 .NET Standard 2.0 和 .NET Standard 2.1。因此,它是一个 .NET Standard 2.1 平台。您可以轻松地在本地重现它:创建一个面向 .NET Core 3.1 的控制台应用程序,并引用包 Microsoft.Azure.Functions.Extensions 1.1.0 和 Microsoft.EntityFrameworkCore 5.0.0-rc.1.20451.13 作为函数应用程序提供的示例确实如此。执行该应用程序运行良好。【参考方案2】:如果您使用的是 .NET core 3.1 或更低版本。将 Microsoft.Extensions.DependencyInjection 和 Microsoft.Extensions.DependencyInjection.Abstractions 的 NuGet 包降级为 3.x.x。
【讨论】:
如果我不是呢?【参考方案3】:Azure Function v3 尚不支持它。 https://github.com/Azure/azure-functions-vs-build-sdk/issues/472
但是,如果您想在本地测试它,我可以运行更新 Azure Function Core Tools 目录中的 DLL: C:\Program Files\Microsoft\Azure Functions 核心工具
我需要替换/更新这些 Dll 以将 EF5 与我的功能一起使用: Dll's list
Microsoft.Extensions.DependencyInjection.Abstractions.dll
Microsoft.Extensions.Logging.Abstractions.dll
Microsoft.Extensions.Options.dll
Microsoft.Extensions.Primitives.dll
【讨论】:
【参考方案4】:我将我的 Azure 函数切换为支持 .NET 5.0 的隔离进程。这只发生在最近(2021 年 3 月)。据我所知,它看起来像 .NET 5.0 won't be supported in-process(.NET 6.0 将是)。发布了here 的指南,我列出了我为现有项目采取的步骤。
步骤
在 .csproj 中,定位 .NET 5.0 (<TargetFramework>net5.0</TargetFramework>
) 并添加 <OutputType>Exe</OutputType>
。切换到以下包:
Microsoft.Azure.Functions.Worker
Microsoft.Azure.Functions.Worker.SDK
还将Microsoft.Azure.WebJobs.Extensions.*
替换为Microsoft.Azure.Functions.Worker.*
。
在 local.settings.json 中将运行时更改为:"FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
。
如果您没有,请添加Program.cs
。使用以下内容:
public static class Program
public static void Main()
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.ConfigureServices(services =>
// Add your services here...
)
.Build();
host.Run();
在您的触发器中,您需要将 [FunctionName("Example")]
更新为 [Function("Example")]
,并将您的 using 语句更新为 Microsoft.Azure.Functions.Worker
。
文章底部列出了 .NET Core 3.1 和 .NET 5.0 支持之间的一些差异here,值得在进行更改之前查看!尽管在“正常”意义上,依赖注入是开箱即用的。我认为可以重新设计Program.cs
以使用您现有的创业公司。
调试
要调试程序,您可以使用 Azure Function CLI 运行函数并附加 Visual Studio 调试器。
-
在 CSProj 目录中打开终端。
运行
func start --dotnet-isolated-debug
。
当应用程序运行时,您需要查找进程 ID 或 PID。该行类似于“Azure Functions .NET Worker (PID: ###)”。
在 Visual Studio 中。 Debug
> Attach to Process...
,按上一步中的PID(dotnet.exe)和Attach
搜索。
进一步阅读
文档似乎有点零星,我还找到了另一个关于开发和发布 .NET 5.0 Azure 函数的指南here。
this issue 更能说明发生了什么。
【讨论】:
我按照指南进行操作,但我无法调试 Azure 函数。 Visual Studio 不加载符号并显示“经典”消息:“断点当前不会被命中”。你有同样的问题吗? 在调试方面,它不是很好。当您运行该服务时,第一个消息将是进程 ID (PID)。完成后,您可以将 Visual Studio 附加到该进程并以这种方式对其进行调试。我将更新我的答案以包含这些步骤。【参考方案5】:我有一个 .Net Standard 2.1 lib 项目,其中包含一个注入到我的函数应用程序中的服务。在我的解决方案中引用的库:
Microsoft.Extensions.Options v5.0.0
我将包版本改为3.1.11后,我的函数应用运行成功。换句话说,如果您的函数应用引用的任何项目都引用了 .Net 5.0 包,那么如果您使用 DI,您似乎会遇到此异常。
我的函数应用中的当前版本: 函数应用:.Net Core 3.1 Azure Functions 版本:3 其他库:.Net Standard 2.1
我从函数应用程序的 .Net 5.0 开始,但现在显然不支持:.NET 5 support on Azure Functions
希望这个答案很快就会过时,但从 2021 年 1 月 24 日起,不要在你的 Azure 函数应用解决方案/项目中使用 .Net 5.0 项目或包引用。
【讨论】:
以上是关于Azure 函数 V3 无法使用 EF 核心 5.0-rc1 加载文件或程序集 Microsoft.Extensions.DependencyInjection.Abstractions,版本 = 5的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Azure Functions v3 迁移到 .net core 5.0
Azure 函数,EF Core,无法加载 ComponentModel.Annotations 4.2.0.0
Azure Function v3 - 在启动中添加标识时“无法访问 Azure Functions 运行时”
如何在 .NET 5 隔离进程中使用 Azure Functions v3 时添加以前在 Startup.cs 中的代码->配置方法