若您要將應用程式移轉至 .NET 9 語言,則可能會受此處列出的重大變更影響。 變更會依技術領域分組,例如 ASP.NET Core 或 Windows Forms。
本文會將每個重大變更分類為「二進位不相容」或「來源不相容」,或分類為「行為變更」:
二進位不相容 - 針對新的執行階段或元件執行時,現有的二進位檔可能會發生重大行為變更,例如載入或執行失敗,如果發生此情況,則需要重新編譯。
來源不相容 - 使用新的 SDK 或元件重新編譯,或以新的執行階段為目標時,現有的原始程式碼可能需要來源變更才能順利編譯。
行為改變 ——現有程式碼與二進位檔在執行時可能有不同的行為。 如果不需要新的行為,則必須更新並重新編譯現有的程式碼。
ASP.NET Core
| 標題 | 變更類型 |
|---|---|
| DefaultKeyResolution.ShouldGenerateNewKey 變更的意義 | 行為變更 |
| 開發者憑證導出不再建立資料夾 | 行為變更 |
| 轉送標頭 中間件忽略來自未知代理的 X-Forwarded-* 標頭 | 行為變更 |
| HostBuilder 可在開發環境中啟用 ValidateOnBuild/ValidateScopes (英文) | 行為變更 |
| 舊版Mono和 Emscripten API 未匯出至全域命名空間 | 來源不相容 |
| 具有多個建構函式的中間件類型 | 行為變更 |
容器
| 標題 | 變更類型 | 已推出的版本 |
|---|---|---|
| 容器映像不再安裝 zlib | 行為變更 | 預覽 7 |
| .NET 監視器映像簡化為僅含版本標籤 | 行為變更 | 預覽 5 |
Core .NET 程式庫
| 標題 | 變更類型 | 已推出的版本 |
|---|---|---|
| 使用 CompressionLevel 新增 ZipArchiveEntry 會設定 ZIP 中央目錄標頭一般用途位元旗標 | 行為變更 | 預覽 5 |
| 變更了非開放泛型的 UnsafeAccessor 支援 | 行為變更 | 預覽 6 |
| 使用自訂診斷識別碼的 API 廢止 | 來源不相容 | (多個) |
| 影響到 StringValues 隱式運算符的不明確多載解析 | 來源不相容 | GA |
| BigInteger 最大長度 | 行為變更 | 預覽 6 |
| BinaryReader.ReadString() 在錯誤的序列中回傳「\uFFFD」 | 行為變更 | 預覽 7 |
C# 多載解析時偏好 params Span 類型的多載 |
來源不相容 | |
| 不允許建立類型為 System.Void 的陣列 | 行為變更 | 預覽 1 |
對於標示了 Equals() 的類型,GetHashCode() 和 InlineArrayAttribute 執行預設拋出 |
行為變更 | 預覽 6 |
| EnumConverter 會驗證已註冊的類型是否為列舉 | 行為變更 | 預覽 7 |
| FromKeyedServicesAttribute 不再插入非索引鍵參數 | 行為變更 | RC 1 |
| IncrementingPollingCounter 初始回呼為非同步 | 行為變更 | RC 1 |
| 強制執行內嵌陣列結構大小限制 | 行為變更 | 預覽 1 |
| InMemoryDirectoryInfo 在檔案前面加上 rootDir | 行為變更 | 預覽 1 |
| 採用整數的新 TimeSpan.From*() 重載版本 | 來源不相容 | 預覽 3 |
| 某些 OOB 套件的新版本 | 來源不相容 | 預覽 5 |
| RuntimeHelpers.GetSubArray 傳回不同的類型 | 行為變更 | 預覽 1 |
| String.Trim(params ReadOnlySpan<char>) 多載已移除 | 原始碼/二進位不相容 | GA |
| 支援空白的環境變數 | 行為變更 | 預覽 6 |
| ZipArchiveEntry 名稱和註解遵循 UTF8 標誌 | 行為變更 | RC 1 |
密碼編譯
| 標題 | 變更類型 | 已推出的版本 |
|---|---|---|
| API 已從 System.Security.Cryptography.Pkcs netstandard2.0 中移除 | 來源不相容 | GA |
| SafeEvpPKeyHandle.DuplicateHandle 向上參照控制代碼 (英文) | 行為變更 | 預覽 7 |
| 部分 X509Certificate2 和 X509Certificate 建構函式已有所淘汰 | 來源不相容 | 預覽 7 |
| Windows 私密金鑰存留期已簡化 | 行為變更 | 預覽 7 |
部署
| 標題 | 變更類型 | 已推出的版本 |
|---|---|---|
| 已被取代的桌面 Windows/macOS/Linux MonoVM 執行階段套件 | 來源不相容 | 預覽 7 |
Entity Framework Core
Interop
| 標題 | 變更類型 | 已推出的版本 |
|---|---|---|
| 默認支援 CET | 二進制不相容 | 預覽 6 |
JIT 編譯器
| 標題 | 變更類型 | 已推出的版本 |
|---|---|---|
| 浮點數到整數的轉換是飽和的 | 行為變更 | 預覽 4 |
| 部分 SVE API 已移除 | 來源不相容 | RC 2 |
網路
| 標題 | 變更類型 | 已推出的版本 |
|---|---|---|
| API 已淘汰功能 | 來源不相容 | 預覽 6 |
| HttpClient 無條件地報告度量指標 | 行為變更 | 預覽 7 |
| HttpClientFactory 記錄會依預設隱藏標頭值 | 行為變更 | RC 1 |
| HttpClientFactory 使用 SocketsHttpHandler 作為主要處理程式 | 行為變更 | 預覽 6 |
| HttpListenerRequest.UserAgent 可以為 null | 來源不相容 | 預覽 1 |
| HttpClient EventSource 事件中的 URI 查詢修訂 | 行為變更 | 預覽 7 |
| IHttpClientFactory 記錄中的 URI 查詢修訂 | 行為變更 | 預覽 7 |
SDK 和 MSBuild
| 標題 | 變更類型 | 已推出的版本 |
|---|---|---|
dotnet sln add 不允許無效的檔名 |
行為變更 | 9.0.2xx |
dotnet watch與舊架構不相容的 Hot Reload |
行為變更 | RC 1 |
dotnet workload 命令的輸出變更 |
行為變更 | 預覽 1 |
版本庫版本不再記錄installer |
行為變更 | 預覽 5 |
| MSBuild 自定義文化特性資源處理 | 行為變更 | 9.0.200/9.0.300 |
| 以 .NET Framework 為目標時使用的新預設 RID | 來源不相容 | GA |
| 終端記錄器是預設的 | 行為變更 | 預覽 1 |
| .NET 9 SDK 的版本需求 | 來源不相容 | GA |
| 針對 .NET Standard 1.x 目標發出的警告 | 來源不相容 | 預覽 6 |
| 針對 .NET 7 目標發出的警告 | 來源不相容 | GA |
序列化
| 標題 | 變更類型 | 已推出的版本 |
|---|---|---|
| BinaryFormatter 一律會擲回 | 行為變更 | 預覽 6 |
| 可為空的 JsonDocument 屬性反序列化為 JsonValueKind.Null | 行為變更 | 預覽 1 |
| System.Text.Json 元數據讀取器現在會取消檢視元數據屬性名稱 | 行為變更 | GA |
Windows Forms
| 標題 | 變更類型 | 已推出的版本 |
|---|---|---|
| BindingSource.SortDescriptions 不會傳回 null | 行為變更 | 預覽 1 |
| 可空性註釋的變更 | 來源不相容 | 預覽 1 |
| ComponentDesigner.Initialize 擲回 ArgumentNullException | 行為變更 | 預覽 1 |
| DataGridViewRowAccessibleObject.Name 起始資料列索引 | 行為變更 | 預覽 1 |
| IMsoComponent 支援需自行選擇啟用 | 行為變更 | 預覽 2 |
| 新的安全性分析器 | 來源不相容 | RC 1 |
| 如果 DataGridView 為 null,則沒有例外狀況 | 行為變更 | 預覽 1 |
| PictureBox 引發 HttpClient 例外狀況 | 行為變更 | 預覽 6 |
| StatusStrip 使用不同的預設渲染器 | 行為變更 | GA |
WPF
| 標題 | 變更類型 | 已推出的版本 |
|---|---|---|
GetXmlNamespaceMaps 類型變更 |
行為變更/來源不相容 | 預覽 3 |