.NET 6升级至.NET 8时加载Microsoft.Extensions.Configuration失败求助
.NET 8.0升级后Cosmos变更提要函数依赖冲突问题
我正尝试将API仓库从.NET 6.0升级到.NET 8.0,同时把Cosmos数据库SDK从2.13.1升级到3.35.4。API和数据库本身升级看起来没问题,但本地测试变更提要(Change Feed)函数时出现依赖冲突错误。这是我们首个升级到.NET 8.0的仓库,属于首次尝试。
错误信息
无法加载类型'Microsoft.Extensions.Configuration.IConfigurationRoot',程序集'Microsoft.Extensions.Configuration.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'中不存在该类型。
已尝试操作
- 检查所有NuGet包,定位
Microsoft.Extensions.Configuration的定义位置 - 手动安装8.0.0版本的
Microsoft.Extensions.Configuration包,试图覆盖低版本依赖
冲突来源
领域层的Columbia.Cosmos.Common NuGet包,以及函数层的Microsoft.Azure.Functions.Extensions都引入了Microsoft.Extensions.Configuration,但版本不一致导致冲突。
领域层csproj文件
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> <GenerateTargetFrameworkAttribute>false</GenerateTargetFrameworkAttribute> <ImplicitUsings>disable</ImplicitUsings> </PropertyGroup> <ItemGroup> <Compile Remove="Consumer\**" /> <EmbeddedResource Remove="Consumer\**" /> <None Remove="Consumer\**" /> </ItemGroup> <ItemGroup> <PackageReference Include="cdtservicecommon" Version="[*,9999.0]" /> <PackageReference Include="Columbia.Cosmos.Common" Version="3.1.0" /> <PackageReference Include="Microsoft.ApplicationInsights" Version="2.20.0" /> <PackageReference Include="Microsoft.Azure.Cosmos" Version="3.46.0" /> <PackageReference Include="Microsoft.NETCore.App" Version="2.2.8" /> </ItemGroup> </Project>
变更提要函数csproj文件
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <AzureFunctionsVersion>v4</AzureFunctionsVersion> </PropertyGroup> <ItemGroup> <PackageReference Include="Azure.Messaging.ServiceBus" Version="7.7.0" /> <PackageReference Include="Columbia.ServiceBus.Common" Version="2.0.0" /> <PackageReference Include="csc.azure.datalake.client" Version="4.0.0-preview1" /> <PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" /> <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.CosmosDB" Version="3.0.10" /> <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="5.2.0" /> <PackageReference Include="Microsoft.Extensions.Http.Polly" Version="6.0.3" /> <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.0.1" /> <PackageReference Include="Polly" Version="7.2.3" /> <PackageReference Include="Polly.Contrib.WaitAndRetry" Version="1.1.1" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\cscentconsumer.infrastructure\cscentconsumer.infrastructure.csproj" /> </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文件
using CdtServiceCommon.Domain.Interfaces; using CdtServiceCommon.Infrastructure.Logging; using Columbia.Cosmos.Common.Extensions; using Columbia.Cosmos.Common.FaultTolerance; using csc.azure.datalake.client.Extensions; using cscentconsumer.domain.Models.Consumer; using CscEntConsumer.Infrastructure.Configuration; using CscEntConsumer.Infrastructure.Repository; using CscEntConsumerFunctions; using CscEntConsumerFunctions.Configuration; using CscEntConsumerFunctions.Utilities; using CscEntConsumerFunctions.Utilities.Interfaces; using Microsoft.ApplicationInsights.Extensibility; using Microsoft.Azure.Functions.Extensions.DependencyInjection; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System; using System.Linq; [assembly: WebJobsStartup(typeof(Startup))] namespace CscEntConsumerFunctions { public class Startup : FunctionsStartup { public override void Configure(IFunctionsHostBuilder builder) { IConfigurationRoot config = new ConfigurationBuilder() .SetBasePath(Environment.CurrentDirectory) .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true) .AddEnvironmentVariables() .Build(); builder.Services.AddDatalakeClient(options => config.Bind(options)); builder.Services.AddSingleton(config); builder.Services.AddCosmosDb( config.GetValue<string>("cosmosdb-connection"), options => { options.DatabaseId = config["CosmosDb:DatabaseId"]; options.Containers = config["CosmosDb:Containers"].Split(',').ToList(); }, cosmosResiliencySettings: config.GetValue<CosmosResiliencySettings>("CosmosResiliencySettings")); builder.Services.AddOptions(); builder.Services.Configure<ConsumerServiceDetails>(config.GetSection("ServiceDetails")); builder.Services.Configure<DataLakeConfiguration>(config); builder.Services.AddSingleton<IModelMasterRepository<Consumer>, ConsumerMasterRepository>(); builder.Services.AddUpserterAsSingleton<IModelMasterRepository<Consumer>, Consumer, string>(); builder.Services.AddSingleton<ITelemetryInitializer, TelemetryInitializer>(); builder.Services.AddSingleton<IMessageBuilderUtility, MessageBuilderUtility>(); } } }
解决方案建议
1. 统一配置相关包版本
在函数项目的csproj中,显式添加8.0.0版本的配置相关包,强制覆盖所有间接引用的低版本:
<ItemGroup> <PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" /> </ItemGroup>
2. 升级老旧依赖包
- 将
Microsoft.Azure.Functions.Extensions升级到最新兼容.NET 8的版本(如1.1.0之后的稳定版) - 将
Microsoft.Azure.WebJobs.Extensions.CosmosDB升级到4.x系列(如4.3.0),该系列原生支持.NET 8 - 将
Microsoft.NET.Sdk.Functions升级到最新的.NET 8兼容版本(如4.2.0或更高)
3. 移除无效包引用
领域层csproj中的Microsoft.NETCore.App版本2.2.8完全多余(目标框架已是net8.0),直接删除该行:
<!-- 移除这一行 --> <PackageReference Include="Microsoft.NETCore.App" Version="2.2.8" />
4. 使用函数内置配置
在Functions Startup中,无需手动构建IConfigurationRoot,直接使用框架内置的配置对象,避免版本冲突:
public override void Configure(IFunctionsHostBuilder builder) { // 替换手动构建的config为内置配置 IConfiguration config = builder.GetContext().Configuration; // 后续代码保持不变 }
5. 清理并重新还原包
执行以下命令清理缓存并重新同步依赖:
dotnet clean dotnet nuget locals all --clear dotnet restore
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

