【问题标题】:Azure function V3 could not load file or assembly Microsoft.Extensions.DependencyInjection.Abstractions, Version=5.0.0.0 with EF core 5.0-rc1Azure 函数 V3 无法使用 EF 核心 5.0-rc1 加载文件或程序集 Microsoft.Extensions.DependencyInjection.Abstractions,版本 = 5.0.0.0
【发布时间】: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))]

【问题讨论】:

标签: dependency-injection entity-framework-core azure-functions


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

    1. 在 CSProj 目录中打开终端。
    2. 运行func start --dotnet-isolated-debug
    3. 当应用程序运行时,您需要查找进程 ID 或 PID。该行类似于“Azure Functions .NET Worker (PID: ###)”。
    4. 在 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 项目或包引用。

    【讨论】:

      猜你喜欢
      • 2021-03-06
      • 2021-06-26
      • 2021-10-09
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 2023-02-04
      • 2021-02-24
      • 2023-03-21
      相关资源
      最近更新 更多