.NET 11 正式版已经放出。这版是 STS(标准期限支持)版本,官方支持两年。需要长周期支持的团队继续用 .NET 10 LTS 就行,两者质量策略一样,只是支持时长不同。

顺带提醒一句:.NET 8 和 .NET 9 在 2026 年 11 月 10 日已经停止支持,还在跑这两个版本的项目该安排升级了。

先放一张这版的整体结构图,后面按层展开说:

.NET 11 架构图

C# 15:联合类型是最大亮点

C# 15 随 .NET 11 成为默认语言版本。最重要的新东西是 union types——一个值可以是若干种已声明类型之一,switch 表达式会检查你是否处理了所有情况:

ProductLookup result = new Product(42, "Mechanical keyboard");

string message = result switch
{
    Product product => $"Found {product.Name}",
    ProductNotFound missing => $"No product with ID {missing.Id}",
};

public sealed record Product(int Id, string Name);
public sealed record ProductNotFound(int Id);
public union ProductLookup(Product, ProductNotFound);

以前想表达"要么查到了,要么没查到",返回值只能塞 object 或者硬凑一个公共基类,现在类型签名自己就说明白了。

配合的还有 closed hierarchies:closed 类只允许在同一个程序集内派生,编译器据此对整个继承体系做模式检查。简单说——组合已有类型用 union,自己掌控的继承树用 closed。

小改进也不少。集合表达式可以传构造参数了:

HashSet names =
    [with(StringComparer.OrdinalIgnoreCase), "Alice", "ALICE", "Bob"];

Console.WriteLine(names.Count); // 2,比较器忽略了大小写

另外还有扩展索引器和带标签的 break/continue。内存安全那套东西还在预览,想用要单独开启。

F# 11 主要是编译器内存占用和 FSharp.Core 集合分配的优化,以及给并发异步任务设上限的手段。

SDK:日常命令明显变快

这版 SDK 默认启用了 Native AOT 的 CLI 宿主。--help、查版本这类命令不用再拉起托管运行时,快了不少。MSBuild 服务器也会在命令之间保持驻留,省掉重复启动。Linux 和 macOS 的安装包因为程序集去重也小了一圈。

其他值得知道的:

  • 文件级应用支持 #:include 拆分成多个源文件
  • dotnet watch 能接 Aspire 应用宿主,支持崩溃恢复和移动设备选择
  • dotnet test(Microsoft.Testing.Platform)加了运行级超时和失败次数上限
  • 容器发布支持 SOURCE_DATE_EPOCH 生成可复现镜像摘要,已有清单不会重复推层
  • NuGet 源可以配置"包发布最小年龄"——新发布的版本等几天才会被还原选中,算是给供应链攻击加一道缓冲。注意这只是辅助手段,替代不了漏洞扫描

另外有个处于公共预览的新工具 dotnetup,用来在用户目录下管理多个 SDK 版本,比手动装省心。

运行时:几百项优化,外加一个预览中的大招

照例,Stephen Toub 写了那篇一年一度的性能长文,几百项 JIT 和类库优化:更多边界检查和冗余分支被消除、去虚拟化更激进、常量折叠范围更大,编译期能确定输入的 SequenceEqual 也能直接优化掉。Native AOT 的接口分派改用共享辅助代码,接口调用多的程序会有感。

硬件方面,x64 和 Arm64 上 Half 类型用上了 FP16 指令。诊断方面,进程内崩溃报告(托管堆栈、模块信息、运行时状态)从移动平台扩展到了 Linux 和 macOS。

Runtime Async 是预览了整整一年的特性:把异步的状态机从编译器手里收归运行时。最直观的好处是调试时能看到真正的异步方法调用栈,而不是一堆状态机残骸。不过这版仍是预览,想试的话:


  runtime-async=on

上生产之前先验证依赖库和诊断工具的兼容性。

类库:一批"终于内置了"的功能

  • Process 新增一次性执行并捕获输出/退出码的方法,高级场景支持句柄继承、挂起启动、发信号。写构建工具的人能省掉不少样板代码
  • System.IO.Compression 内置 Zstandard;ZIP 读取加了 CRC32 校验
  • 四个内存流适配器:ReadOnlyMemoryStream、WritableMemoryStream、ReadOnlySequenceStream、StringStream。管道里的 ReadOnlySequence 不用先拷贝成连续数组就能当 Stream 用
  • System.Text.Json 支持 C# 联合类型、F# 判别联合,异步序列可以直接输出 JSON Lines
  • LINQ 加了 FullJoin,两侧没匹配上的元素都会保留,做数据对账很好用

EF Core 11

查询翻译继续打磨:更多场景下去掉多余的 JOIN,GroupBy 翻译更好,FullJoin 在支持的关系库上也能翻译。复杂类型和 JSON 列现在可以用在 TPT/TPC 继承上。SQL Server 用户多了向量索引和近似向量搜索,不过这套 API 是实验性的。

注意 EF Core 11 只跑在 .NET 11 上,升级前先确认数据库提供程序跟上了。

ASP.NET Core 和 Blazor

  • C# 联合类型在所有走 System.Text.Json 的地方都生效,包括 Minimal API 和 MVC 的请求响应体,OpenAPI 文档用 anyOf 表达。路由、查询字符串、表单绑定不在此列
  • 异步验证:配合新的异步 DataAnnotations,验证逻辑里可以 await 数据库查询,不用再阻塞线程
  • OpenAPI 3.2 成为默认,能描述 SSE 流里每个事件的载荷。工具链还没跟上 3.2 的话可以手动指定旧版本
  • SignalR 认证刷新:长连接不用断开重连就能更新身份,Blazor Interactive Server 组件能收到新身份并响应
  • Blazor 新增 CacheView 组件:静态 SSR 时缓存某个组件子树的渲染结果,命中就直接回放 HTML,子组件根本不创建。页面里那些渲染很贵但基本不变的部分有救了
  • 交互式 Server 应用可以配置线路自动暂停:标签页不活跃超过设定时长就释放它占的服务器内存和连接。默认不开,需要显式配置
  • 还有一套实验性的 Blazor AI 组件(流式聊天、工具渲染、审批流),配合 AG-UI 协议可以搭智能体交互界面。整个 .NET 11 周期内都是预发布状态,可以玩,别上生产

.NET MAUI:默认换 CoreCLR

MAUI 这版把默认运行时统一成 CoreCLR,移动端、桌面端和其他 .NET 工作负载用上了同一套运行时基座。Apple 平台不允许 JIT,走预编译加解释器。Native AOT 仍是可选项,Android 上还算实验性质。

开发体验上:XAML 增量热重载(预览,Debug 默认开)能直接改活着的页面实例;XAML 文件不用再重复写命名空间声明;Windows 默认用新的 CollectionView2 处理器。

一个坑要留意:Microsoft.Maui.Controls.Compatibility 包彻底不发了,还依赖它的应用得先迁移。

Windows 桌面这边,新应用推荐 WinUI 3;WinForms 加了可选的现代视觉样式;WPF 主要是可靠性修复。

AI 开发这块

微软在 .NET 里铺了一整条 AI 开发链路,从下到上大致是:

  • MEAI(Microsoft.Extensions.AI):IChatClient、IEmbeddingGenerator 这类抽象,NuGet 包形式提供,配依赖注入、缓存、OpenTelemetry 都是熟悉的写法
  • MCP:SDK 自带了 MCP 服务器模板,基于官方 MCP C# SDK,一行命令就能起一个带示例工具的服务器:
dotnet new mcpserver -o MyMcpServer
  • Microsoft Agent Framework(MAF):在上面两层基础上做智能体和工作流编排,智能体可以挂 MCP 工具,也能通过 ASP.NET Core 的 AG-UI 端点接 Blazor 前端

工具侧也有几样东西:给编码智能体提供官方指引的 .NET Skills、让智能体直接查看和操作运行中 MAUI 应用的 DevFlow(实验性)、可视化跟踪 Copilot 升级进度的 Upgrade 画布。

升级怎么做

装 .NET 11 SDK,IDE 用 VS 2026 或者 VS Code + C# Dev Kit。新项目:

dotnet new console -n HelloDotnet11 -f net11.0
dotnet run --project HelloDotnet11

老项目迁移建议按这个顺序来:

  1. 仓库里有 global.json 的话先改它,开发机和 CI 上装对应 SDK
  2. 改目标框架到 .NET 11,包和工作负载升到兼容版本
  3. 过一遍官方的重大变更列表——这版提高了最低 CPU 要求,老机器上部署的要特别注意。只装新 SDK 不会自动改你的目标框架
  4. 跑测试、压测,把实际的发布方式(容器镜像、自包含、Native AOT)都验证一遍

从 RC 升上来的记得换正式版,别留在预发布构建上。

最后

.NET 11 是七千多名贡献者的成果。NuGet 上现在有超过 58.9 万个包,累计下载量 1.1 万亿次。

这版没有那种颠覆性的单点变化,但语言(联合类型)、工具链(启动速度)、AI 开发链路这几条线都在往前走。建议拿手头一个真实项目升上去跑跑看,比看 release notes 更有体感。


相关链接

发布与下载

深入了解

升级与政策

社区

本文根据微软 .NET 官方博客整理,内容以官方文档为准。


原文地址: https://www.cveoy.top/t/topic/qHVV 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录