共享框架中包含的一些 Microsoft.Extensions 包

为了减小应用程序大小、简化包依赖项和简化服务,.NET 11 在基本共享框架中包含 9 个 Microsoft.Extensions.* 库。 显式引用这些包的项目会收到生成警告 NU1510。 您可以通过删除 PackageReference 来消除此警告。 如果你依赖这些包的较旧版本,升级到 .NET 11 可能会暴露出在较旧版本到 .NET 11 之间引入的破坏性变更。

已引入的版本

.NET 11 预览版 4

以前的行为

以前,以下Microsoft.Extensions.*库不属于.NET共享框架。 (通过使用 Sdk="Microsoft.NET.Sdk",或类似地引用 其他 .NET SDK 中的任意一个,你就会获得共享框架。)需要它们的项目必须显式添加 PackageReference 条目,而生成过程会将程序集复制到输出文件夹:

新行为

从 .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别名。
  • 使用完全限定的类型名称。

如果您依赖这些软件包的旧版本:

若要避免运行时故障(如 MissingMethodExceptionTypeLoadException),请针对 .NET 11 引用程序集重新编译任何依赖库或二进制文件。 如果以 net11.0 为目标,请删除 PackageReference 并重新构建。 如果面向早期 TFM 或多目标,请将非net11.0 目标的包引用更新为当前版本,然后重新编译。

升级到这些包的 .NET 11 版本时,先前版本中的以下重大变更可能会显现出来:

Microsoft.Extensions.DependencyInjection.Abstractions

Microsoft.Extensions.Logging.Abstractions

Microsoft.Extensions.Hosting.Abstractions

受影响的 API

None.