部分 Microsoft.Extensions 套件已包含在共用架構中

為了縮小應用程式規模、簡化套件相依並簡化服務流程,.NET 11 在基礎共享框架中包含九個 Microsoft.Extensions.* 函式庫。 明確引用這些套件的專案會收到建置警告 NU1510。 你可以透過移除 PackageReference. 來解決這個警告。 如果你依賴這些套件的舊版本,升級到 .NET 11 版本可能會暴露出舊版本與 .NET 11 之間帶來的破壞性變更。

所推出的版本

.NET 11 預覽版 4

以前的行為

過去,以下Microsoft.Extensions.*函式庫並不包含在.NET共享框架中。 (你可以透過使用 Sdk="Microsoft.NET.Sdk",或類似地引用任一其他.NET SDK來獲得共享框架。)需要這些程式的專案需要明確的 PackageReference 條目,建置過程會將組裝檔複製到輸出資料夾:

新行為

從 .NET 11 開始,這九個函式庫成為 .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

Microsoft.Extensions.Logging.Abstractions

Microsoft.Extensions.Hosting.Abstractions

受影響的 API

沒有。