无法加载文件或程序集'Microsoft.Extensions.Configuration.Abstractions,Version = 5.0.0.0'在Azure函数中。

49

我有一个API和一个独立的Azure Functions应用程序。我将API应用程序升级到了.NET 5,它工作得很好。在API应用程序的解决方案中,我有类库项目,在我的Azure Functions应用程序中也引用了这些类库。这些类库是netstandard2.1项目。

自从这次更新以来,在此期间我还将所有NuGet包更新到了最新版本,我的Azure Functions应用程序就停止工作了。我收到以下错误提示:

无法加载文件或程序集“Microsoft.Extensions.Configuration.Abstractions,Version=5.0.0.0,Culture=neutral,PublicKeyToken=adb9793829ddae60”。系统找不到指定的文件。值不能为 null。(参数“provider”)

我注意到Microsoft.Extensions.*包有一些破坏性变化,他们的建议是直接安装导致问题的包。所以我手动向我的Azure Functions添加了Microsoft.Extensions.Configuration.Abstractions -- 之前它是作为Microsoft.Extensions.Configuration包的依赖项被安装的。以下是关于此事的信息:https://github.com/dotnet/aspnetcore/issues/21033

问题仍然存在。我甚至尝试将API和Functions应用程序中的Microsoft.Extensions.Configuration版本降级,但仍然收到相同的错误。

你有什么解决这个问题的想法吗?


5
对我而言,将 Microsoft.Extensions.* NuGet 包降级至版本 3.1.10 解决了这个问题,因此我认为你的结论有道理,Microsoft.Extensions 的重构可能是问题所在。我不仅需要进行一次干净的构建,而且还必须退出 VS 并重新启动它。 - Chris Rae
遇到了同样的问题。这是官方文档中的参考链接 https://learn.microsoft.com/en-us/dotnet/core/compatibility/aspnetcore#extensions-package-reference-changes-affecting-some-nuget-packages。 - Gary Chan
2
那个页面上的修复方法(手动引用 Microsoft.Extensions.Configuration.Abstractions)对我没起作用。可能是Azure函数部署的某种特定问题? - Chris Rae
11
@ChrisRae 您是正确的!将 Microsoft.Extensions.* 降级到 3.1.10 可以解决这个问题。之前这个方法对我没有用,因为我只降级了 Microsoft.Extensions.Configuration 但没有降级 Microsoft.Extensions.DependencyInjection。显然,有共享库,所以所有的 Microsoft.Extensions.* 都必须被降级。谢谢! - Sam
3
正如@ChrisRae所提到的,安装Microsoft.Extensions.Configuration.Abstractions对我也没有用!唯一的解决方案似乎是回到所有Microsoft.Extensions.*包的版本3.1.10 - Sam
在版本号大于等于5.0.0的情况下,Microsoft.EntityFrameworkCore.Tools与Microsoft.Extensions.*包一起使用会导致这个问题。 - Matt Stannett
14个回答

37

Sam 的评论应该被接受为正确答案。我尝试将 Microsoft.Extensions* (在我的情况下是 Microsoft.Extensions.Logging.Console)从 5.0.0 降级到 3.1.0,错误就消失了。太棒了!


1
如果您正在使用Entity Framework,同样的事情。将其从版本5.0.9降级到版本3.1.18。我遇到了同样的问题,但在Microsoft.EntityFrameworkCore*包中找到了错误。 - H. Pauwelyn
我们在7.0.0版本中遇到了相同的错误,并通过将Npgsql.EntityFrameworkCore.PostgreSQL软件包从7.0.0降级到6.0.0来解决它。 - Tekin

34

如果您正在从.NET Core 3.1升级到.NET 6,且遇到此错误,则需要将Azure函数版本更改为v4,即可解决此错误。


谢谢!你帮我省了很多时间。 - mlienau
实际的包是什么?“Azure Functions”有点通用。 - Captain Prinny
7
@CaptainPrinny,这不是NuGet包,而是Azure函数的.csproj文件中的值:<azurefunctionsversion>v4</azurefunctionsversion>` - Dan Cook
11
我已经使用v4版本,但仍然无法正常工作。还有其他解决方法吗?<TargetFramework>net6.0</TargetFramework> <AzureFunctionsVersion>v4</AzureFunctionsVersion> - ispostback
1
.NET 7,v4仍然存在这个问题。 - Stuart Dobson
对我来说,仍然无法正常工作,所以我不得不将"Microsoft.Extensions.Http"从"8.0.0-rc.1.23419.4"降级到"6.0.0"。 - undefined

28
作为参考,这个GitHub链接详细解释了为什么会出现这种情况。
而现在,你要么找到被引用的确切版本,要么将所有东西降级到最新的v3版本构建。
简而言之,Azure Functions SDK已经在内存中加载了一些依赖项,因此你的库不能使用相同库的更新版本。

谢谢提供链接。问题和解决方案都描述得非常准确! - Ashutosh

10
在这里添加答案,以帮助任何从.NET 3.1升级到.NET 6.0的人。
首先,请遵循@Jeff的答案,在Azure Functions项目的.csproj文件中引用v4: v4 然而,在我的情况下,这已经设置好了。
Azure Function在本地正常运行,但在Azure DevOps管道中,我遇到了OP所描述的错误。
我注意到,在本地调试Azure Function时,控制台输出:
Azure Functions Core Tools
Core Tools Version:       4.0.3928 Commit hash: 7d1d4a32700695bbf290a871c7492fde84bb767e  (64-bit)
Function Runtime Version: 4.0.1.16815

在我的情况下,我实际上是为了端到端测试目的在Azure DevOps流水线中运行Azure函数。为了实现这一点,我首先使用以下npm命令在构建代理上安装Azure函数核心工具:

npm install azure-functions-core-tools -g

然而,这将安装azure-functions-core-tools@3.0.3904(版本3.x-而不是最新的版本4.x)。

然后,我安装了Azure函数核心工具(v4),例如通过使用此npm命令进行安装。

npm i -g azure-functions-core-tools@4 --unsafe-perm true

对于我来说,这解决了错误。

无论您是否完全符合此情况,请确保在使用Azure函数运行时v4和.NET 6时使用Azure函数核心工具v4.x。


哦,这是非常有用的信息,我们也遇到了同样的问题,正在进行从3.1到6的迁移。我们的跟踪历史记录显示,我们在尝试更新到.NET 5时也遇到了这个问题。 - Captain Prinny
请问,您是将一个Azure函数单独部署在更大的管道上吗?我们目前有一个项目,其中函数与主应用程序在同一解决方案中,我不知道通用的构建代理安装是否能够覆盖所有基础设施。 - Captain Prinny
刚刚将这个添加到我们的管道顶部,用于多个事情,似乎就是这么简单。不确定为什么需要这样做,但我希望其他人也能看到这里。 - Captain Prinny

8
如@binaryDi在其答案中提到的那样,您需要降级引用版本5的Microsoft.Extensions.Configuration.Abstractions包的程序包。
这可能有点麻烦,因为它不会告诉您实际上哪些程序包正在引用Microsoft.Extensions.Configuration.Abstractions包/命名空间。
对我来说,我必须将Microsoft.Extensions.Caching.MemoryMicrosoft.EntityFrameworkCore.SqlServer更新到5之前的版本。任何引用dotnet 5的内容都应该降级以使Azure函数运行。

酷,但现在 .NET 6 怎么样? - Captain Prinny
我不太确定。由于.NET 6是LTS版本,我的最佳猜测是它应该适用于.NET 6。但我们还没有升级我们的函数,所以我无法确认。 - Newteq Developer
@NewteqDeveloper,请在完成后告诉我。 我已经有v4了,但它对我仍然无效。<TargetFramework>net6.0</TargetFramework> <AzureFunctionsVersion>v4</AzureFunctionsVersion> - ispostback
@ispostback 这太奇怪了。.Net 6是LTS版本,所以现在您使用的所有功能应该都能正常工作。不幸的是,我们已经停用了所有功能,并采用了不同的自定义构建方法,因此我无法再进行验证。如果您仍然在.NET 6上遇到问题,我肯定建议您联系微软自己,因为6是LTS,所以它应该得到Azure中所有内容的支持。5是STS,因此可能没有得到相同的关注。 - Newteq Developer
降级不是解决方案,尤其是现在3.1版本已经不再受支持。 - Stuart Dobson
问到问题的时候,以及问题相关的时候,降级是一个解决方案。这是少数几个解决方案之一。这个问题已经过时了,因为Azure已更新他们的Azure Functions来运行新版本的dotnet。 - Newteq Developer

4
在将C#函数项目从NETCORE 3.1升级到.NET 6时,我也遇到了这个错误。
我在项目的.csproj中设置了以下内容。
<AzureFunctionsVersion>v4</AzureFunctionsVersion>

并且还在Function App的配置部分(Azure门户)中更改了应用程序设置值

"FUNCTIONS_EXTENSION_VERSION" from "~3" to "~4"

这对我解决了问题。


这对我很有效。Azure Functions Net5和Entity Framework 5.0。我差点把所有东西都降级到Core 3.1。 - O'Neil Tomlinson

4

我曾经遇到过同样的问题,Azure Functions 的版本配置已经存在。

<AzureFunctionsVersion>v4</AzureFunctionsVersion>

我将版本为7的 Microsoft.Extensions.Http 降级至6,以解决该问题。
<PackageReference Include="Microsoft.Extensions.Http" Version="6.0.0" />

没对我起作用。 - ispostback
在这种情况下,您可能需要尝试此页面上的其他解决方案。 - Tarun Bhatt

3
我在寻找升级到.NET 6.0的解决方案时发现了这个问题。由于我购买了一台带有M1处理器和Arm支持的Macbook,因此不能回退,只能在.NET 6.0中使用Arm支持。
仅仅添加<AzureFunctionsVersion>v4</AzureFunctionsVersion>是不够的,因为这并没有增加Azure上的运行时版本。
我的函数已经在3.0版本上运行,但奇怪的是我无法在门户中选择v4.0版本。我必须通过Azure CLI更改版本。
如何进行更改的更多信息可以在此处找到:https://learn.microsoft.com/en-us/azure/azure-functions/set-runtime-version?tabs=azurecli

2

当我将一个C#函数项目从版本3升级到版本4时,我也遇到了这个错误。

我已经设置了<AzureFunctionsVersion>v4</AzureFunctionsVersion>,但这并没有解决它。

@neeohw的答案指引我找到了解决方案,但我还需要进一步挖掘,以下是对我有用的解决方法:

按照此处指定的Azure cli命令操作: https://learn.microsoft.com/en-us/azure/azure-functions/functions-versions?tabs=in-process%2Cv4&pivots=programming-language-csharp#azure

我建议您阅读该部分以获得背景理解,但运行的命令如下:

az functionapp config appsettings set --settings FUNCTIONS_EXTENSION_VERSION=~4 -n <APP_NAME> -g <RESOURCE_GROUP_NAME>

# 仅适用于Windows函数应用程序,还需启用.NET 6.0,该版本是运行时所需的 az functionapp config set --net-framework-version v6.0 -n <APP_NAME> -g <RESOURCE_GROUP_NAME>


1

当我尝试在Azure Functions中托管升级后的函数时,遇到了问题。之前的版本针对netcoreapp3.1进行了优化,我将其升级为目标网6.0,并将v4设置为Azure Function版本。

错误信息为“无法在Azure Functions中加载文件或程序集'Microsoft.Extensions.Configuration',Version=6.0.0.0”。

经过几个小时的研究,我发现造成这个问题的原因是启动类,因为它是唯一使用了Configuration的地方。

Startup更改为继承自FunctionsStartup而不是WebJobsStartup,就解决了这个问题。稍作调整后,它就正常工作了。

[assembly: FunctionsStartup(typeof(Startup))]

...

public class Startup : FunctionsStartup { ... 

public override void Configure(IFunctionsHostBuilder builder)
    {

        var configuration = new ConfigurationBuilder()
            .AddEnvironmentVariables()
            .Build();

        builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

        builder.Services.AddHttpClient();

        ...
     }

就是这样!


可能需要更多的细节。 - ispostback
@ispostback,我无法深入挖掘functionsStartup和WebJobsStartup之间的区别。当我删除了一些类并只留下裸骨代码时,我才发现了它们之间的差异 :-)。 - Prem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接