如果要将应用迁移到 .NET 9,则此处列出的中断性变更可能会影响到你。 变更按技术领域分组,例如 ASP.NET Core 或 Windows 窗体。
本文将每个中断性变更分类为“二进制不兼容”或“源不兼容”,或者作为“行为更改”:
二进制文件不兼容 - 当针对新的运行时或组件运行时,现有二进制文件可能会遇到行为上的中断性变更(例如加载或执行失败),如果是这样,则需要重新编译。
源代码不兼容 - 当使用新的 SDK 或组件重新编译,或以新的运行时为目标时,现有源代码可能需要更改源才能成功编译。
行为更改 - 现有代码和二进制文件在运行时的行为可能会有所不同。 如果不需要新的行为,则需要更新和重新编译现有代码。
ASP.NET Core
容器
| 标题 | 更改类型 | 引入的版本 |
|---|---|---|
| 容器映像不再安装 zlib | 行为变更 | 预览版 7 |
| .NET Monitor 映像简化为仅使用版本标签 | 行为变更 | 预览版 5 |
Core .NET 库
| 标题 | 更改类型 | 引入的版本 |
|---|---|---|
| 使用 CompressionLevel 添加 ZipArchiveEntry 时,会设置 ZIP 中央目录标头常规用途位标志 | 行为变更 | 预览版 5 |
| 已更改对非开放泛型的 UnsafeAccessor 支持 | 行为变更 | 预览版 6 |
| API 已过时并带有自定义诊断 ID | 源不兼容 | (多个) |
| 影响 StringValues 隐式运算符的歧义重载解析 | 源不兼容 | GA |
| BigInteger 最大长度 | 行为变更 | 预览版 6 |
| BinaryReader.GetString() 在格式错误的序列上返回 "\uFFFD" | 行为变更 | 预览版 7 |
C# 的重载解析首选 params 范围类型的重载 |
源不兼容 | |
| 不允许创建 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 |
密码
| 标题 | 更改类型 | 引入的版本 |
|---|---|---|
| 从 System.Security.Cryptography.Pkcs netstandard2.0 中删除的 API | 源不兼容 | GA |
| SafeEvpPKeyHandle.DuplicateHandle 增加句柄的引用计数 | 行为变更 | 预览版 7 |
| 某些 X509Certificate2 和 X509Certificate 构造函数已过时 | 源不兼容 | 预览版 7 |
| 简化了 Windows 私钥生存期 | 行为变更 | 预览版 7 |
部署
| 标题 | 更改类型 | 引入的版本 |
|---|---|---|
| 弃用的桌面 Windows/macOS/Linux MonoVM 运行时包 | 源不兼容 | 预览版 7 |
Entity Framework Core
互作
| 标题 | 更改类型 | 引入的版本 |
|---|---|---|
| 默认支持 CET | 不兼容二进制 | 预览版 6 |
JIT 编译器
| 标题 | 更改类型 | 引入的版本 |
|---|---|---|
| 浮点数到整数转换将要饱和 | 行为变更 | 预览版 4 |
| 删除了一些 SVE API | 源不兼容 | RC 2 |
网络
| 标题 | 更改类型 | 引入的版本 |
|---|---|---|
| API 过时 | 源不兼容 | 预览版 6 |
HttpClient 指标无条件报告 server.port |
行为变更 | 预览版 7 |
| 默认情况下,HttpClientFactory 日志记录会编修标头值 | 行为变更 | RC 1 |
| HttpClientFactory 使用 SocketsHttpHandler 作为主要处理程序 | 行为变更 | 预览版 6 |
| HttpListenerRequest.UserAgent 可为空 | 源不兼容 | 预览版 1 |
| HttpClient EventSource 事件中的 URI 查询修订 | 行为变更 | 预览版 7 |
| IHttpClientFactory 日志中的 URI 查询修订 | 行为变更 | 预览版 7 |
SDK 和 MSBuild
| 标题 | 更改类型 | 引入的版本 |
|---|---|---|
dotnet sln add 不允许无效的文件名 |
行为变更 | 9.0.2xx |
dotnet watch 与旧框架的热重载不兼容 |
行为变更 | 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 |
| 可为 Null 的 JsonDocument 属性反序列化为 JsonValueKind.Null | 行为变更 | 预览版 1 |
| System.Text.Json 元数据阅读器现在可取消元数据属性名称的转义 | 行为变更 | GA |
Windows 窗体
| 标题 | 更改类型 | 引入的版本 |
|---|---|---|
| BindingSource.SortDescriptions 不返回 null | 行为变更 | 预览版 1 |
| 对为 null 性批注的更改 | 源不兼容 | 预览版 1 |
| ComponentDesigner.Initialize 引发 ArgumentNullException | 行为变更 | 预览版 1 |
| DataGridViewRowAccessibleObject.Name 起始行索引 | 行为变更 | 预览版 1 |
| IMsoComponent 支持为选择加入 | 行为变更 | 预览版 2 |
| 新的安全分析器 | 源不兼容 | RC 1 |
| 如果 DataGridView 为 null,则无异常 | 行为变更 | 预览版 1 |
| PictureBox 引发 HttpClient 异常 | 行为变更 | 预览版 6 |
| StatusStrip 使用不同的默认呈现器 | 行为变更 | GA |
WPF
| 标题 | 更改类型 | 引入的版本 |
|---|---|---|
GetXmlNamespaceMaps 类型更改 |
行为变更/源不兼容 | 预览版 3 |