.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# 以及容器镜像等多个方面的改进。
📚 Libraries(库)
Stream adapters for memory and text
四个新的 Stream 类型用于包装常见的内存数据,可以直接传递给任何需要 Stream 的 API,无需先复制到 MemoryStream:
ReadOnlyMemoryStream— 将ReadOnlyMemory<byte>暴露为只读流WritableMemoryStream— 将可写的Memory<byte>暴露为固定大小的流ReadOnlySequenceStream— 将ReadOnlySequence<byte>(例如来自System.IO.Pipelines的缓冲区)直接作为流使用,无需展平StringStream— 将string或ReadOnlyMemory<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 调用)现在可以不阻塞线程运行。三种新的异步验证方式:
- 继承
AsyncValidationAttribute并重写IsValidAsync方法 - 在模型上实现
IAsyncValidatableObject - 调用新的
Validator.ValidateObjectAsync、TryValidateObjectAsync等方法
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,同时支持反射式序列化器和源生成器。新的 JsonUnionAttribute、JsonUnionCaseInfo 和类型分类器 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 操作:
- 模式化构造 —
CreateGeometricSequence、CreateAlternatingSequence、CreateHarmonicSequence - 交错与去交错 —
Zip、ZipLower/ZipUpper、Unzip、UnzipEven/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.Open和TryOpen— 按 ID 打开现有进程的句柄
⏱️ Runtime(运行时)
Runtime-async 性能改进
运行时内置的 async/await 实现持续加速:
JIT async 支持 — JIT 现在直接编译专用运行时异步版本的同步 task 返回方法,而不是通过 thunk 委托。JIT 将方法的尾调用转换为运行时异步调用并等待原本会返回的 task,异步路径不再需要额外的间接层。
相关改进进一步减少挂起开销:
- JIT 尾部合并异步挂起点,使生成的代码更小
- 用于运行时异步可调用 task thunk 的延续(continuation)被缓存和重用
- 已池化的方法自动退出运行时异步,避免冗余工作
无需 ExecutionContext 的异步延续 — 异步延续现在可以选择退出 ExecutionContext 的捕获和恢复。运行时检测到延续无需恢复时,完全跳过捕获/恢复周期。Task、Task<T>、ValueTask 和 ValueTask<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 --version、dotnet --info、dotnet --helpdotnet <command> --help(每个内置命令)dotnet --cli-schemadotnet sln list、dotnet sln migrate、dotnet 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-Site 和 Origin 头拒绝不安全的跨源请求。适用于 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 方法调用。传递 CancellationToken 给 InvokeAsync 并取消它时,客户端发送取消消息,服务器端 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 实现相匹配。支持 LinearItemsLayout、GridItemsLayout、页眉页脚、空视图、分组、选择模式、对齐、增量加载和 RefreshView。
Handler-based Shell architecture on Android
Android 上的 Shell 被重新实现,基于标准 MAUI handler 构建,替换了遗留的渲染器类。新的 handler 重用 MAUI 其他部分的相同构建块,如 MauiDrawerLayout 和 TabbedViewManager。
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.FullJoinLINQ 运算符翻译为 SQLFULL OUTER JOIN - 翻译为 NULLIF — EF Core 现在为值等于常量时返回 null 的条件表达式生成 SQL
NULLIF - 空值传播移除冗余 IS NOT NULL 检查 — 简化 SQL 并提高查询计划效率
- 翻译
List<T>.Exists为 SQL — 重写为Queryable.Any并翻译为EXISTS子查询 - SQLite 上翻译 TimeOnly 成员 —
TimeOnly.Hour、Minute、Second翻译为strftime - SQLite 上 string.Join/Concat 带排序 — 翻译为
group_concat带ORDER BY
Keys and indexes traverse complex-type properties
HasKey、HasAlternateKey 和 HasIndex 现在接受遍历非集合复杂属性的 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 lambdas —
Array.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。

浙公网安备 33010602011771号