為了縮小應用程式規模、簡化套件相依並簡化服務流程,.NET 11 在基礎共享框架中包含九個 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 開始,這九個函式庫成為 .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 需要非 null 提供者
- FromKeyedServicesAttribute.Key 屬性可為空
- 未找到鑰匙時使用的非鑰匙服務
- GetKeyedService 與 GetKeyedServices with AnyKey
Microsoft.Extensions.Logging.Abstractions
Microsoft.Extensions.Hosting.Abstractions
- 來自 BackgroundService 的未處理例外狀況
- BackgroundService 會將整個 ExecuteAsync 當作一個任務來執行
- 當 BackgroundService 失敗時,IHost.RunAsync 與 IHost.StopAsync 會拋出
受影響的 API
沒有。