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.DependencyInjectionMicrosoft.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 (&lt;TargetFramework&gt;net5.0&lt;/TargetFramework&gt;) 并添加 &lt;OutputType&gt;Exe&lt;/OutputType&gt;。切换到以下包:

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 中的代码->配置方法

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

EF4 0..1 关系导致错误 2016:无法指定条件