如果要将应用迁移到 .NET 5,此处列出的重大更改可能会影响你。 更改按技术领域分组,例如 ASP.NET 核心或加密。
本文指出每个中断性变更是二进制兼容还是源兼容:
- 二进制兼容 - 现有二进制文件将在不重新编译的情况下成功加载和执行,并且运行时行为不会更改。
- 源代码兼容 - 当面向新运行时或使用新的 SDK 或组件时,源代码将成功编译,而不会发生更改。
ASP.NET Core
代码分析
| 标题 | 二进制兼容 | 源代码兼容 |
|---|---|---|
| CA1416 警告 | ✔️ | ❌ |
| CA1417 警告 | ✔️ | ❌ |
| CA1831 警告 | ✔️ | ❌ |
| CA2013 警告 | ✔️ | ❌ |
| CA2014 警告 | ✔️ | ❌ |
| CA2015 警告 | ✔️ | ❌ |
| CA2200 警告 | ✔️ | ❌ |
| CA2247 警告 | ✔️ | ❌ |
核心 .NET 库
| 标题 | 二进制兼容 | 源代码兼容 |
|---|---|---|
| 适用于单文件发布的与程序集相关的 API 更改 | ❌ | ✔️ |
| BinaryFormatter 序列化方法已过时 | ✔️ | ❌ |
| 代码访问安全 API 已过时 | ✔️ | ❌ |
| CreateCounterSetInstance 会引发 InvalidOperationException | ✔️ | ❌ |
| 默认 ActivityIdFormat 为 W3C | ❌ | ✔️ |
| Environment.OSVersion 返回正确的版本 | ❌ | ✔️ |
| FrameworkDescription 的值是 .NET 而不是 .NET Core | ✔️ | ❌ |
| GAC API 已过时 | ✔️ | ❌ |
| 硬件内在 IsSupported 检查 | ❌ | ✔️ |
| IntPtr 和 UIntPtr 实现 IFormattable | ✔️ | ❌ |
| LastIndexOf 处理空搜索字符串 | ❌ | ✔️ |
| 在 Unix 上使用非 ASCII 字符的 URI 路径 | ❌ | ✔️ |
| API 已过时并带有非默认诊断 ID | ✔️ | ❌ |
| ConsoleLoggerOptions 上的过时属性 | ✔️ | ❌ |
| LINQ OrderBy.First 的复杂性 | ❌ | ✔️ |
| 已重命名或删除 OSPlatform 属性 | ✔️ | ❌ |
| 已删除 Microsoft.DotNet.PlatformAbstractions 包 | ❌ | ✔️ |
| PrincipalPermissionAttribute 已过时 | ✔️ | ❌ |
| 预览版本中的参数名称更改 | ✔️ | ❌ |
| 引用程序集中的参数名称更改 | ✔️ | ❌ |
| 远程处理 API 已过时 | ❌ | ✔️ |
| Activity.Tags 列表的顺序已反转 | ✔️ | ❌ |
| SSE 和 SSE2 比较方法处理 NaN | ✔️ | ❌ |
| Thread.Abort 已过时 | ✔️ | ❌ |
| Unix 上的 UNC 路径的 URI 识别 | ❌ | ✔️ |
| UTF-7 代码路径已过时 | ✔️ | ❌ |
| Vector2.Lerp 和 Vector4.Lerp 的行为更改 | ✔️ | ❌ |
| Vector<T> 抛出 NotSupportedException | ❌ | ✔️ |
密码学
| 标题 | 二进制兼容 | 源代码兼容 |
|---|---|---|
| 浏览器不支持加密 API | ❌ | ✔️ |
| Cryptography.Oid 只能初始化 | ✔️ | ❌ |
| Linux 上的默认 TLS 密码套件 | ❌ | ✔️ |
| 加密抽象上的 Create() 重载已过时 | ✔️ | ❌ |
| 默认 FeedbackSize 值已更改 | ✔️ | ❌ |
Entity Framework Core (实体框架核心)
全球化
| 标题 | 二进制兼容 | 源代码兼容 |
|---|---|---|
| 在 Windows 上使用 ICU 库 | ❌ | ✔️ |
| StringInfo 和 TextElementEnumerator 符合 UAX29 | ❌ | ✔️ |
| 拉丁语-1 字符的 Unicode 类别已更改 | ✔️ | ❌ |
| TextInfo.ListSeparator 值已更改 | ✔️ | ❌ |
互作
| 标题 | 二进制兼容 | 源代码兼容 |
|---|---|---|
| 已删除对 WinRT 的支持 | ❌ | ✔️ |
| 将 RCW 强制转换为 InterfaceIsIInspectable 会引发异常 | ❌ | ✔️ |
| 不在非 Windows 平台上探测 A/W 后缀 | ❌ | ✔️ |
网络
| 标题 | 二进制兼容 | 源代码兼容 |
|---|---|---|
| Cookie 路径处理符合 RFC 6265 | ✔️ | ❌ |
| LocalEndPoint 在调用 SendToAsync 后更新 | ✔️ | ❌ |
| MulticastOption.Group 不接受 null | ✔️ | ❌ |
| 流允许后续开始操作 | ❌ | ✔️ |
| 从 .NET 运行时中删除了 WinHttpHandler | ❌ | ✔️ |
开发工具包
安全
| 标题 | 二进制兼容 | 源代码兼容 |
|---|---|---|
| 代码访问安全 API 已过时 | ✔️ | ❌ |
| PrincipalPermissionAttribute 已过时 | ✔️ | ❌ |
| UTF-7 代码路径已过时 | ✔️ | ❌ |
序列化
| 标题 | 二进制兼容 | 源代码兼容 |
|---|---|---|
| BinaryFormatter.Deserialize 重新包装异常 | ✔️ | ❌ |
| JsonSerializer.Deserialize 需要单字符字符串 | ✔️ | ❌ |
| ASP.NET Core 应用程序将带引号的数字反序列化 | ✔️ | ❌ |
| JsonSerializer.Serialize 引发 ArgumentNullException | ✔️ | ❌ |
| 不用于反序列化的非公共无参数构造函数 | ✔️ | ❌ |
| 序列化键值对时可以采用选项 | ✔️ | ❌ |
Windows 窗体
| 标题 | 二进制兼容 | 源代码兼容 |
|---|---|---|
| 本机代码无法访问 Windows 窗体对象 | ✔️ | ❌ |
| OutputType 设置为 WinExe | ❌ | ✔️ |
| DataGridView 不会重置自定义字体 | ✔️ | ❌ |
| 方法引发 ArgumentException | ✔️ | ❌ |
| 方法抛出 ArgumentNullException | ✔️ | ❌ |
| 属性引发 ArgumentOutOfRangeException | ✔️ | ❌ |
| TextFormatFlags.ModifyString 已过时 | ✔️ | ❌ |
| DataGridView API 引发 InvalidOperationException | ✔️ | ❌ |
| WinForms 应用使用 Microsoft.NET.Sdk | ❌ | ✔️ |
| 已删除状态栏控件 | ✔️ | ❌ |
WPF(Windows Presentation Foundation)
| 标题 | 二进制兼容 | 源代码兼容 |
|---|---|---|
| OutputType 设置为 WinExe | ❌ | ✔️ |
| WPF 应用使用 Microsoft.NET.Sdk | ❌ | ✔️ |