.NET 7引用Microsoft.Extensions.Logging.AzureAppServices时编译失败
我升级了C# ASP.NET Core应用的NuGet包,其中包含Microsoft.Extensions.Logging.AzureAppServices 8.0.0,但在.NET 7.0环境下编译失败,报错:
Startup.cs(18,18): error CS0121: 调用在以下方法或属性之间存在歧义: 'Microsoft.Extensions.DependencyInjection.OptionsBuilderExtensions.ValidateOnStart(Microsoft.Extensions.Options.OptionsBuilder)' 和 'Microsoft.Extensions.DependencyInjection.OptionsBuilderExtensions.ValidateOnStart(Microsoft.Extensions.Options.OptionsBuilder)'
报错代码行:
services.AddOptions<MyOptions>() .Bind(Configuration.GetSection(MyOptions.Name)) .ValidateDataAnnotations() .ValidateOnStart();
我尝试显式调用Microsoft.Extensions.DependencyInjection.OptionsBuilderExtensions中的该方法,但问题未解决,目前没找到能在.NET 7.0下编译的办法。最小复现项目的项目文件内容如下:
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net7.0</TargetFramework> <IsPackable>true</IsPackable> </PropertyGroup> <PropertyGroup> <NoWarn>CA1805,CA1812,CS1573,CS1591,CS8002,TS1009</NoWarn> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.Extensions.Logging.AzureAppServices" Version="8.0.0" /> </ItemGroup> </Project>
这个问题的核心是Microsoft.Extensions.Logging.AzureAppServices 8.0.0依赖的是.NET 8版本的Microsoft.Extensions.Options包,而你的项目基于.NET 7,导致同一个ValidateOnStart方法同时存在于.NET 7自带的程序集和NuGet引入的.NET 8程序集中,引发调用歧义。
以下是几种可行的解决方式:
降级NuGet包版本
将Microsoft.Extensions.Logging.AzureAppServices降级到适配.NET 7的稳定版本(比如7.0.14),修改项目文件中的包引用:<PackageReference Include="Microsoft.Extensions.Logging.AzureAppServices" Version="7.0.14" />强制绑定.NET 7版本的依赖包
如果必须使用8.0.0版本,可在项目文件中显式引入.NET 7版本的Microsoft.Extensions.Options并开启绑定重定向:<ItemGroup> <PackageReference Include="Microsoft.Extensions.Options" Version="7.0.1" /> </ItemGroup> <PropertyGroup> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> </PropertyGroup>同时在代码中通过完整调用路径指定方法:
Microsoft.Extensions.DependencyInjection.OptionsBuilderExtensions.ValidateOnStart( services.AddOptions<MyOptions>() .Bind(Configuration.GetSection(MyOptions.Name)) .ValidateDataAnnotations() );升级项目到.NET 8
如果业务允许,直接将项目的目标框架改为net8.0,完全兼容8.0.0版本的NuGet包,从根源上避免版本冲突:<TargetFramework>net8.0</TargetFramework>
内容的提问来源于stack exchange,提问作者Claus Appel

