.NET 11 Preview 6 正式发布!

.NET 11 Preview 6 正式发布!

原文:.NET 11 Preview 6 is now available! - .NET Blog
作者:.NET Team

今天,我们非常激动地宣布 .NET 11 的第六个预览版正式发布!本次发布涵盖了 .NET Runtime、SDK、库、ASP.NET Core、.NET MAUI、C#、Entity Framework Core、F# 以及容器镜像等多个方面的改进。

📥 下载 .NET 11 Preview 6


📚 Libraries(库)

Stream adapters for memory and text

四个新的 Stream 类型用于包装常见的内存数据,可以直接传递给任何需要 Stream 的 API,无需先复制到 MemoryStream

  • ReadOnlyMemoryStream — 将 ReadOnlyMemory<byte> 暴露为只读流
  • WritableMemoryStream — 将可写的 Memory<byte> 暴露为固定大小的流
  • ReadOnlySequenceStream — 将 ReadOnlySequence<byte>(例如来自 System.IO.Pipelines 的缓冲区)直接作为流使用,无需展平
  • StringStream — 将 stringReadOnlyMemory<char> 使用指定编码读取为流
// 将字符串传递给需要 Stream 的 API,无需中间的 byte[]
using Stream config = new StringStream(yamlText, Encoding.UTF8);
var settings = ParseConfiguration(config);

// 将现有缓冲区暴露为只读流,例如作为 HTTP 请求体
ReadOnlyMemory<byte> payload = GetPayload();
using Stream body = new ReadOnlyMemoryStream(payload);
await httpClient.PostAsync(uri, new StreamContent(body));

Asynchronous validation with DataAnnotations

System.ComponentModel.DataAnnotations 现在支持异步验证。需要执行 I/O 操作的验证规则(如数据库查找、远程 API 调用)现在可以不阻塞线程运行。三种新的异步验证方式:

  1. 继承 AsyncValidationAttribute 并重写 IsValidAsync 方法
  2. 在模型上实现 IAsyncValidatableObject
  3. 调用新的 Validator.ValidateObjectAsyncTryValidateObjectAsync 等方法
public sealed class ValidVatNumberAttribute : AsyncValidationAttribute
{
    protected override ValidationResult? IsValid(object? value, ValidationContext context) =>
        throw new InvalidOperationException("请使用 IsValidAsync 验证此属性。");

    protected override async Task<ValidationResult?> IsValidAsync(
        object? value, ValidationContext context, CancellationToken cancellationToken)
    {
        var registry = context.GetRequiredService<IVatRegistry>();
        return await registry.IsRegisteredAsync((string?)value, cancellationToken)
            ? ValidationResult.Success
            : new ValidationResult("该 VAT 号码未在税务机构注册。");
    }
}

Microsoft.Extensions.Options 也获得了匹配的支持,选项可以异步验证,包括通过新的 IAsyncStartupValidator 在启动时验证。

System.Text.Json serializes C# union types

System.Text.Json 现在可以序列化和反序列化新的 C# 联合类型(union types)。序列化器通过新的 JsonTypeInfoKind.Union 合约类型识别联合,读写当前激活的 case,同时支持反射式序列化器和源生成器。新的 JsonUnionAttributeJsonUnionCaseInfo 和类型分类器 API 让你可以自定义 case 的发现和命名方式。

Configure Activity tracing with rules

Microsoft.Extensions.Diagnostics 中新增的追踪配置 API 让你可以通过规则来开启和关闭 Activity 追踪,无需手动配置 ActivityListener 实例。

builder.Services.AddTracing(tracing =>
{
    tracing.EnableTracing(sourceName: "MyCompany.Orders");
    tracing.DisableTracing(sourceName: "MyCompany.Orders", operationName: "HealthCheck");
});

规则也可以通过配置驱动,无需重新部署即可调整追踪设置。

Cross-lane operations for vectors

Vector128<T>Vector256<T>Vector512<T>Vector64<T>Vector<T> 新增了一套 lane 构造和组合方法,以前需要手写 shuffle 操作:

  • 模式化构造CreateGeometricSequenceCreateAlternatingSequenceCreateHarmonicSequence
  • 交错与去交错ZipZipLower/ZipUpperUnzipUnzipEven/UnzipOdd
  • 重排Concat 系列和 Reverse

Start processes suspended and look them up by id

System.Diagnostics.Process 增加了对启动和查找进程的更精细控制:

  • ProcessStartInfo.StartSuspended — 在 Windows 上以挂起状态启动进程,配合 SafeProcessHandle.Resume 在完成设置后再让它运行
  • Process.TryGetProcessById — 返回 false 而不是抛出异常(当不存在对应 ID 的进程时)
  • SafeProcessHandle.OpenTryOpen — 按 ID 打开现有进程的句柄

⏱️ Runtime(运行时)

Runtime-async 性能改进

运行时内置的 async/await 实现持续加速:

JIT async 支持 — JIT 现在直接编译专用运行时异步版本的同步 task 返回方法,而不是通过 thunk 委托。JIT 将方法的尾调用转换为运行时异步调用并等待原本会返回的 task,异步路径不再需要额外的间接层。

相关改进进一步减少挂起开销:

  • JIT 尾部合并异步挂起点,使生成的代码更小
  • 用于运行时异步可调用 task thunk 的延续(continuation)被缓存和重用
  • 已池化的方法自动退出运行时异步,避免冗余工作

无需 ExecutionContext 的异步延续 — 异步延续现在可以选择退出 ExecutionContext 的捕获和恢复。运行时检测到延续无需恢复时,完全跳过捕获/恢复周期。TaskTask<T>ValueTaskValueTask<T> 都受益于此变更。

JIT improvements

  • Math.BigMul 在 x64 上的性能提升 — JIT 在操作数均为 64 位值时生成单条 MUL r/m64 指令,消除了调用开销
  • RyuJIT:单 IG 序言限制移除 — 复杂序言不再需要挤在一个指令组中
  • SELECT(cond, cns, cns)cns — JIT 现在折叠两个分支产生相同常量的条件选择
  • ARM64:SVE 下 Vector<T> 按引用传递 — 启用 SVE 支持时,Vector<T> 值按引用而非按值传递

In-process crash report logging

新的进程内崩溃报告机制从崩溃进程中捕获诊断信息,适用于移动平台。进程内路径在被终止前记录托管堆栈跟踪、模块列表和关键运行时状态。

NativeAOT: faster interface dispatch

NativeAOT 现在为接口方法调用使用 dispatch helper。运行时将接口分发路由到共享的 helper,该 helper 可在调用站点预热后修补到正确的实现。这减小了接口调用站点的二进制大小,并提高了具有大量接口方法调用的工作负载的吞吐量。

SIMD: Lane construction and composition APIs

System.Runtime.Intrinsics 新增了硬件向量类型的 lane 构造和组合 API。可以从单独指定的 lane 构造向量,以及在向量之间提取或重新排序 lane,为图像处理、音频 DSP 和其他 SIMD 密集型工作负载提供精细控制。

🛠️ SDK

NativeAOT CLI serves the full command surface

Preview 5 将 NativeAOT dotnet-aot 库打包并置于 DOTNET_CLI_ENABLEAOT=true 标志后。Preview 6 保持了默认关闭的行为,但将托管和 NativeAOT CLI 解析器统一为单一共享实现,因此 AOT 快速路径现在可以解析、验证并渲染每个命令的 --help

以下命令完全由 AOT 路径提供:

  • dotnet --versiondotnet --infodotnet --help
  • dotnet <command> --help(每个内置命令)
  • dotnet --cli-schema
  • dotnet sln listdotnet sln migratedotnet sln remove

工具和外部命令调用(全局工具、PATH 命令、app-base 命令)现在也从 AOT 路径解析和启动,跳过 600-700ms 的托管 CLI 启动时间。

dotnet test gains new options and improved output

通过 Microsoft.Testing.Platform (MTP) 运行时新增功能:

  • --no-dependencies — 跳过构建项目到项目的引用
  • DOTNET_TEST_RUNNER 环境变量 — 选择测试运行器,无需修改 global.json
  • --use-current-runtime / --ucr — 在还原和构建时针对当前运行时
  • --test-modules 排除模式 — 以 ! 开头的模式视为排除项
  • 两阶段 Ctrl+C 取消 — 第一次按下停止调度新的测试应用并显示提示,第二次强制终止所有子测试进程
  • 实时显示正在运行的测试 — 进度区域显示正在进行的测试

Test templates support xUnit v3 and NUnit on Microsoft.Testing.Platform

内置的 xunit 模板新增 --xunit-version 选项,v3 生成默认使用 MTP 运行器的 xUnit v3 项目。nunit 模板也新增 --test-runner 选项以选择 MTP。C#、F# 和 VB 模板均支持。

File-based apps support #:include .dll references

基于文件的应用现在可以使用 #:include 包含编译的 DLL 引用,无需功能标志。.dll 文件默认作为 Reference 项处理。

Container publishing supports multi-arch builds with Podman

SDK 内置的容器发布现在支持使用 Podman 构建多架构容器镜像,此前多架构构建需要 Docker。

TypeScript outputs integrate with Static Web Assets

使用 Microsoft.TypeScript.MSBuild 的 Razor 类库项目现在 TypeScript 编译输出正确集成到 ASP.NET Core 静态 Web 资产管道中。

CLI honors MSBuild server and standard OpenTelemetry env vars

dotnet CLI 不再在 DOTNET_CLI_USE_MSBUILD_SERVER 未设置时抑制 MSBuild 构建服务器。OTLP 遥测导出器现在也可以在存在任何标准 OpenTelemetry OTEL_EXPORTER_OTLP_* 环境变量时启用。

C# 更新

Extension indexers

C# 现在支持扩展索引器,允许为类型添加索引器功能,类似于扩展方法的工作方式。

Unions ship their support types in the box

联合类型的支持类型现在内置在框架中,无需外部依赖即可使用 C# 联合类型功能。

🌐 ASP.NET Core

Async validation for minimal APIs

最小 API 验证现在端到端支持异步验证器。集成新的异步 DataAnnotations API,Microsoft.Extensions.Validation 现在在端点验证请求时运行它们。

Automatic cross-origin (CSRF) protection

使用 WebApplication.CreateBuilder 构建的应用现在自动基于浏览器的 Sec-Fetch-SiteOrigin 头拒绝不安全的跨源请求。适用于 Minimal API、MVC、Razor Pages 和 Blazor。

Blazor Virtualize can scroll to an item

Virtualize<TItem> 组件现在可以在指定项处打开,并按需滚动到任何项:

  • InitialIndex — 在首次交互式渲染时将列表定位到指定项
  • ScrollToIndexAsync — 在首次渲染后的任何时候滚动到指定项

Configure Blazor client behavior from the server

Blazor 应用现在可以在映射 Razor 组件时从服务器端用 C# 配置客户端启动行为,WithBrowserOptions 设置客户端日志级别、交互式服务器重连、WebAssembly 运行时环境等。

Blazor Gateway can proxy backend API calls

Blazor Gateway 现在可以通过内置的 YARP 反向代理将应用的 HTTP 调用代理到后端服务。WebAssembly 客户端只向 Gateway 发出同源请求,无需在客户端或后端配置 CORS。

OpenAPI 3.2 by default

生成的 OpenAPI 文档现在默认以 OpenAPI 3.2 为目标,这是最新版本的规范。

Unions in ASP.NET Core

C# 联合类型在整个 ASP.NET Core 栈中作为 JSON 请求体和返回类型工作:

  • Minimal APIs — 联合体参数和返回类型
  • MVC 和 Razor Pages — JSON 请求体和响应中的联合类型
  • SignalR — Hub 方法参数、返回值和流项的联合类型
  • Blazor — 组件参数、JS 互操作参数和结果中的联合类型

Short-circuit endpoints with an attribute

新的 [ShortCircuit] 属性标记端点在路由后立即运行,跳过其余中间件管道。适用于健康检查、robots.txt 等不需要认证、CORS 的端点。

SignalR authentication refresh

SignalR 连接现在可以在访问令牌过期时无需断开连接即可刷新认证。服务器暴露 /refresh 端点,.NET 客户端在令牌过期前重新认证。

Cancel hub invocations from the client

SignalR 客户端现在可以取消常规(非流式)Hub 方法调用。传递 CancellationTokenInvokeAsync 并取消它时,客户端发送取消消息,服务器端 Hub 方法的 CancellationToken 参数被触发。

dotnet user-jwts supports file-based apps

dotnet user-jwts 现在通过新的 --file 选项支持基于文件的应用(单个 app.cs,无项目文件)。

📱 .NET MAUI

CollectionView2 comes to Windows

下一代 CollectionView (CV2) 现在在 Windows 上拥有基于 WinUI 的 ItemsRepeater 的 handler,与 Android、iOS 和 Mac Catalyst 上已有的 CV2 实现相匹配。支持 LinearItemsLayoutGridItemsLayout、页眉页脚、空视图、分组、选择模式、对齐、增量加载和 RefreshView

Handler-based Shell architecture on Android

Android 上的 Shell 被重新实现,基于标准 MAUI handler 构建,替换了遗留的渲染器类。新的 handler 重用 MAUI 其他部分的相同构建块,如 MauiDrawerLayoutTabbedViewManager

Microsoft.Maui.Controls.Compatibility package removed

可选的 Microsoft.Maui.Controls.Compatibility NuGet 包不再构建或发布。明确引用此包或依赖 Xamarin.Forms 兼容渲染器的项目需要迁移。

HybridWebView is now AOT-safe

HybridWebView JavaScript 互操作改用源生成器而非反射,不再产生 trim 或 AOT 警告,在完全剪裁和 Native AOT 应用中正常工作。

Geolocation gains a minimum-distance filter

GeolocationListeningRequest 新增 MinimumDistance 属性(单位:米),前台位置监听只在设备移动至少指定距离后才触发更新。

Android MediaPicker result recovery

Android 上,系统相机或文件选择器在前台时操作系统可能销毁并重建应用进程。Preview 6 新增了可选的恢复 API:

  • MediaPicker.GetRecoveredMediaPickerResultsAsync()
  • MediaPicker.WaitForRecoveredMediaPickerResultsAsync(CancellationToken)
  • MediaPicker.ClearRecoveredMediaPickerResultAsync(string id)

.NET for Android

  • AndroidMessageHandler 现在与 HttpClient 合约和 SocketsHttpHandler 行为一致
  • 传输和协议失败现在抛出 HttpRequestException 而非遗留的 WebException
  • 取消请求现在表现为 OperationCanceledException
  • 新的构建时诊断 XA0149 警告

Apple platforms (.NET for iOS, Mac Catalyst, macOS, tvOS)

  • Xcode 26.6 现在是 Apple 工作负载支持的稳定 Xcode 版本
  • 支持 Icon Composer (.icon) 应用图标
  • NSUrlSessionHandler 正确性改进

🎁 Entity Framework Core

LINQ query translation improvements

  • FULL OUTER JOIN — EF Core 将新的 Queryable.FullJoin LINQ 运算符翻译为 SQL FULL OUTER JOIN
  • 翻译为 NULLIF — EF Core 现在为值等于常量时返回 null 的条件表达式生成 SQL NULLIF
  • 空值传播移除冗余 IS NOT NULL 检查 — 简化 SQL 并提高查询计划效率
  • 翻译 List<T>.Exists 为 SQL — 重写为 Queryable.Any 并翻译为 EXISTS 子查询
  • SQLite 上翻译 TimeOnly 成员TimeOnly.HourMinuteSecond 翻译为 strftime
  • SQLite 上 string.Join/Concat 带排序 — 翻译为 group_concatORDER BY

Keys and indexes traverse complex-type properties

HasKeyHasAlternateKeyHasIndex 现在接受遍历非集合复杂属性的 lambda 和点号路径。还新增了 SQL Server JSON 索引支持。

Unconstrained foreign key relationships

新的 IsConstrained(bool) API 标记不由数据库约束支持的外键关系。设为 false 时查询使用 LEFT JOIN,迁移跳过 AddForeignKey

Azure Cosmos DB provider improvements

Cosmos 提供程序现在支持配置 JSON 索引、复合索引、包含/排除路径和全文索引,以及 LINQ 表达式中的 Convert 操作。

Migrations improvements

  • 索引更改使用 DROP_EXISTING — SQL Server 迁移现在发出单条 CREATE INDEX ... WITH (DROP_EXISTING = ON) 而不是 DROP INDEX + CREATE INDEX
  • 计算列仅 CLR 类型更改时跳过 ALTER COLUMN
  • 通配符 * 支持 dotnet ef 命令
  • 临时时间段列可配置为不隐藏

Microsoft.Data.Sqlite now depends on SQLite3MC.PCLRaw.bundle

Microsoft.Data.Sqlite 现在依赖 SQLite3 Multiple Ciphers bundle 包,为应用提供内置的 SQLite 加密功能。

F# 更新

  • Array.init can inline initialization lambdasArray.init 可以内联初始化 lambda
  • Interpolated strings parse next to equals signs — 插值字符串支持等号旁边解析
  • FSI --quiet keeps restore output off stdout--quiet 保持恢复输出不在 stdout
  • Signature-file diagnostics catch missing semantic attributes — 签名文件诊断捕获缺失的语义属性
  • Debug sequence points cover more F# expressions — 调试序列点覆盖更多 F# 表达式

📦 Container Images(容器镜像)

  • Azure Linux 4.0 images — 新增 Azure Linux 4.0 镜像
  • Smaller Native AOT SDK images — 更小的 Native AOT SDK 镜像

开始使用

要开始使用 .NET 11,请安装 .NET 11 SDK

如果你在 Windows 上使用 Visual Studio,我们建议安装最新的 Visual Studio 2026 Insiders。你也可以使用 Visual Studio Code 和 C# Dev Kit 扩展配合 .NET 11。

posted @ 2026-07-21 11:33  John0King  阅读(68)  评论(0)    收藏  举报