.NET 5 中的破坏性变更

如果要将应用迁移到 .NET 5,此处列出的重大更改可能会影响你。 更改按技术领域分组,例如 ASP.NET 核心或加密。

本文指出每个中断性变更是二进制兼容还是源兼容:

  • 二进制兼容 - 现有二进制文件将在不重新编译的情况下成功加载和执行,并且运行时行为不会更改。
  • 源代码兼容 - 当面向新运行时或使用新的 SDK 或组件时,源代码将成功编译,而不会发生更改。

ASP.NET Core

标题 二进制兼容 源代码兼容
ASP.NET Core 应用程序将带引号的数字反序列化 ✔️
AzureAD.UI 和 AzureADB2C.UI API 已过时 ✔️
BinaryFormatter 序列化方法已过时 ✔️
终结点路由中的资源为 HttpContext ✔️
已删除带有 Microsoft 前缀的 Azure 集成包 ✔️
Blazor:Blazor 应用中的路由优先级逻辑已更改 ✔️
Blazor:更新的浏览器支持 ✔️ ✔️
Blazor:无关紧要的空白被编译器去除 ✔️
Blazor:JSObjectReference 和 JSInProcessObjectReference 类型是内部类型 ✔️
Blazor:NuGet 包的目标框架已更改 ✔️
Blazor:ProtectedBrowserStorage 功能已移至共享框架 ✔️
Blazor:RenderTreeFrame 只读公共字段现在是属性 ✔️
Blazor:更新了静态 Web 资产的验证逻辑 ✔️
浏览器不支持加密 API ✔️
扩展:包引用更改 ✔️
Kestrel 和 IIS BadHttpRequestException 类型已过时 ✔️
IHttpClientFactory 创建的 HttpClient 实例会记录整数状态代码 ✔️
HttpSys:默认情况下禁用客户端证书重新协商 ✔️
IIS:保留 UrlRewrite 中间件查询字符串 ✔️
Kestrel:默认情况下检测到的配置更改 ✔️
Kestrel:默认支持的 TLS 协议版本已更改 ✔️
Kestrel:在不兼容的 Windows 版本上通过 TLS 禁用了 HTTP/2 ✔️ ✔️
Kestrel:Libuv 传输标记为已过时 ✔️
ConsoleLoggerOptions 上的过时属性 ✔️
ResourceManagerWithCultureStringLocalizer 类和 WithCulture 接口成员已删除 ✔️
已删除 Pubternal API ✔️
请求本地化中间件中删除了过时的构造函数 ✔️
中间件:数据库错误页标记为已过时 ✔️
异常处理程序中间件引发原始异常 ✔️ ✔️
ObjectModelValidator 调用验证的新重载 ✔️
已删除 Cookie 名称编码 ✔️
更新了 IdentityModel NuGet 包版本 ✔️
SignalR:MessagePack 中心协议选项类型已更改 ✔️
SignalR:MessagePack Hub 协议已迁移 ✔️
UseSignalR 和 UseConnections 方法已删除 ✔️
CSV 内容类型更改为符合标准的 ✔️

代码分析

标题 二进制兼容 源代码兼容
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 (实体框架核心)

EF Core 5.0 中的重大变更

全球化

标题 二进制兼容 与原代码兼容
在 Windows 上使用 ICU 库 ✔️
StringInfo 和 TextElementEnumerator 符合 UAX29 ✔️
拉丁语-1 字符的 Unicode 类别已更改 ✔️
TextInfo.ListSeparator 值已更改 ✔️

Interop

标题 二进制兼容 与源代码兼容
已删除对 WinRT 的支持 ✔️
将 RCW 强制转换为 InterfaceIsIInspectable 会引发异常 ✔️
不在非 Windows 平台上探测 A/W 后缀 ✔️

网络

标题 二进制兼容 源代码兼容
Cookie 路径处理符合 RFC 6265 ✔️
LocalEndPoint 在调用 SendToAsync 后更新 ✔️
MulticastOption.Group 不接受 null ✔️
流允许后续开始操作 ✔️
从 .NET 运行时中删除了 WinHttpHandler ✔️

SDK

标题 二进制兼容 源代码兼容
默认情况下导入的 Directory.Packages.props 文件 ✔️
当可执行项目引用不匹配的可执行文件时生成的错误 ✔️
FrameworkReference 替换为适用于 Windows SDK 的 WindowsSdkPackageVersion ✔️
未定义NETCOREAPP3_1预处理器符号 ✔️
OutputType 设置为 WinExe ✔️
PublishDepsFilePath 行为的变化 ✔️
TargetFramework 从 netcoreapp 更改为 net ✔️
WinForms 和 WPF 应用使用 Microsoft.NET.Sdk ✔️

安全

标题 二进制兼容 源代码兼容
代码访问安全 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 ✔️

另请参阅