为了减小应用程序大小、简化包依赖项和简化服务,.NET 11 在基本共享框架中包含 9 个 Microsoft.Extensions.* 库。 显式引用这些包的项目会收到生成警告 NU1510。 您可以通过删除 PackageReference 来消除此警告。 如果你依赖这些包的较旧版本,升级到 .NET 11 可能会暴露出在较旧版本到 .NET 11 之间引入的破坏性变更。
已引入的版本
.NET 11 预览版 4
以前的行为
以前,以下Microsoft.Extensions.*库不属于.NET共享框架。 (通过使用 Sdk="Microsoft.NET.Sdk",或类似地引用 其他 .NET SDK 中的任意一个,你就会获得共享框架。)需要它们的项目必须显式添加 PackageReference 条目,而生成过程会将程序集复制到输出文件夹:
- Microsoft.Extensions.Caching.Abstractions
- Microsoft.Extensions.Configuration.Abstractions
- Microsoft.Extensions.DependencyInjection.Abstractions
- Microsoft.Extensions.Diagnostics.Abstractions
- Microsoft.Extensions.FileProviders.Abstractions
- Microsoft.Extensions.Hosting.Abstractions
- Microsoft.Extensions.Logging.Abstractions
- Microsoft.Extensions.Options
- Microsoft。Extensions.Primitives
新行为
从 .NET 11 开始,这 9 个库是.NET基本共享框架的一部分:
- 当你以
net11.0或更高版本为目标时,这些库不需要PackageReference。 - 如果明确引用这些包,则会收到生成警告 NU1510。
- 这些程序集不再复制到输出文件夹。
- 在极少数情况下,默认加载集中的其他 API 可能会导致名称或类型冲突。 若要解决冲突,请添加更多显式
using指令、使用别名或使用完全限定的类型名称。
破坏性变更的类型
此更改为行为更改。
更改原因
在共享框架中包括这些常用库可减少应用程序大小、简化包依赖项以及简化服务。
建议的操作
从任何受影响的软件包中删除 PackageReference:
对于仅面向 net11.0 或更高版本的项目,请彻底删除 PackageReference:
<!-- Remove entries like these from your .csproj when targeting net11.0 only: -->
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="..." />
<PackageReference Include="Microsoft.Extensions.Options" Version="..." />
代码在未经修改的情况下继续工作 , API 现在是运行时的一部分。
对于多目标项目(例如 <TargetFrameworks>net10.0;net11.0</TargetFrameworks>),不会触发 NU1510,因为旧版 TFM 仍然需要该包。 无需执行任何操作 - NuGet 会自动为每个目标框架选择相应的程序集。 如果要显式,可以有条件地包括引用:
<!-- Keep the reference only for TFMs that don't include it in the shared framework: -->
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="..." Condition="'$(TargetFramework)' != 'net11.0'" />
解决编译时名称冲突(罕见):
如果遇到编译错误,因为代码中的名称与其中一个新包含的 API 冲突,请使用以下方法之一:
- 添加更具体的
using指令。 - 使用
using别名。 - 使用完全限定的类型名称。
如果您依赖这些软件包的旧版本:
若要避免运行时故障(如 MissingMethodException 或 TypeLoadException),请针对 .NET 11 引用程序集重新编译任何依赖库或二进制文件。 如果以 net11.0 为目标,请删除 PackageReference 并重新构建。 如果面向早期 TFM 或多目标,请将非net11.0 目标的包引用更新为当前版本,然后重新编译。
升级到这些包的 .NET 11 版本时,先前版本中的以下重大变更可能会显现出来:
Microsoft.Extensions.DependencyInjection.Abstractions
- ActivatorUtilities.CreateInstance 的行为保持一致
- ActivatorUtilities.CreateInstance 需要非空提供程序
- FromKeyedServicesAttribute.Key 属性可为 null
- 未找到密钥时使用的非键式服务
- 支持 AnyKey 的 GetKeyedService 和 GetKeyedServices
Microsoft.Extensions.Logging.Abstractions
Microsoft.Extensions.Hosting.Abstractions
- 来自 BackgroundService 的未经处理的异常
- BackgroundService 将所有 ExecuteAsync 作为任务运行
- 当 BackgroundService 失败时,IHost.RunAsync 和 IHost.StopAsync 引发
受影响的 API
None.