惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
博客园 - 司徒正美
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
A
About on SuperTechFans
Google DeepMind News
Google DeepMind News
T
Tailwind CSS Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
M
MIT News - Artificial intelligence
L
LangChain Blog
aimingoo的专栏
aimingoo的专栏
Engineering at Meta
Engineering at Meta
Martin Fowler
Martin Fowler
H
Help Net Security
B
Blog
Y
Y Combinator Blog
小众软件
小众软件
S
SegmentFault 最新的问题
I
InfoQ
爱范儿
爱范儿
Hugging Face - Blog
Hugging Face - Blog
D
Docker
博客园 - 【当耐特】
J
Java Code Geeks
阮一峰的网络日志
阮一峰的网络日志

博客园 - 张善友

.NET 11 性能全解读:从 JIT 到基础库,这一版到底快了多少 .NET 11 性能深度解读:这一次,真的「到 11」了 把 LLM 密钥从环境变量里解放出来:OpenClaw.NET 迎来 Vault/OpenBao 密钥后端 RedNb.Nacos 2.0.0 正式发布:.NET 接入 Nacos 3.2.4,AI Registry 全能力落地 Rust 成为微软一线语言之后:谈谈 C# 与 Rust 的互补性 .NET 异常处理的"暗门":代码里写满 catch,你依然能抓住它——从一个 AI Agent 运行时的源码说起 写给 C++ 工程师的 OpenClaw.NET 上手指南:用你熟悉的 C++ 思维,跑起一个生产级 AI Agent 写给 PHP 工程师的 OpenClaw.NET 上手指南:用你熟悉的 PHP 思维,跑起一个生产级 AI Agent 写给 Rust 工程师的 OpenClaw.NET 上手指南:用你熟悉的 Rust 思维,跑起一个生产级 AI Agent 从对标 Java 到对标 Go:Native AOT 的"无痛化"之路,走到哪一站了? NuGet 半年度总结:周下载量从 54 亿到 67 亿,.NET 生态的"新一轮增长期"实锤了 写给 Java 工程师的 OpenClaw.NET 上手指南:用你熟悉的 Spring 思维,跑起一个生产级 AI Agent 写给 TypeScript 工程师的 OpenClaw.NET 上手指南:用你熟悉的 TS 思维,跑起一个生产级 AI Agent 写给 Python 工程师的 OpenClaw.NET 上手指南:用你熟悉的 Python 思维,跑起一个生产级 AI Agent 写给 Golang 工程师的 OpenClaw.NET 上手指南:用你熟悉的 Go 思维,跑起一个生产级 AI Agent MetaSkill 落地 .NET:当 Agent 从「调用工具」进化到「组织工具」 都是 AI 写代码,为什么 C# 比 Java 快半拍 MHS 三部曲(下):谁允许 AI 行动?——权力、合规与中国厂商的答卷 弱模型不能裸奔:Agent Harness 凭什么真实有效 MHS 三部曲(中):8 小时集成、六种被拦截的故障,和一次教科书级的翻车 TensorSharp 3.3.0.0 发布,视频生成、DFlash2 投机解码、安全加固一起来了 MHS 三部曲(上):别急着叫它「物理 MCP」——Anthropic 到底发布了什么 编程语言的「第三条道路」上,走得最远的其实是 C# 纯 .NET 手写 CUDA kernel,GLM-5.3-Flash decode 跑出 llama.cpp 的 2 倍 3 张卡到底能不能跑大模型推理?从 vLLM、llama.cpp 到 TensorSharp 的多卡真相 AI 编程时代,.NET 的机会在哪里? Vibe Coding 月提交量 29 亿次之后:GitHub 的危机、Azure 迁移,以及 .NET 的机会 从 PostgreSQL 到 Kubernetes:开源的护城河,从来不写在代码里 人工智能最先替代的,是人工智能学院自己 企业架构的六种场景:从"四大流派"到数字原生与 AI 原生
.NET 11 RC1 发布:拿到"准生证",生产环境可以上了!
张善友 · 2026-09-10 · via 博客园 - 张善友

微软正式发布了 .NET 11 的第一个候选发布版本(Release Candidate 1)

和之前的 Preview 不同,RC1 附带了 go-live 支持许可证——这意味着你可以放心地把它用在生产环境,遇到问题能获得官方支持。按照惯例,接下来就是 RC2,然后 11 月正式 GA。作为 STS(标准期限支持)版本,.NET 11 将获得 2 年支持。

工具链方面,.NET 11 RC1 由全新的 Visual Studio 2026 Insiders 提供支持,VS Code 用户则搭配最新的 C# Dev Kit 扩展即可。

这一版都有哪些新东西?挑重点给大家捋一遍。
image

一、C# 15 正式转正,不用再开 preview 开关了

RC1 最重要的信号之一:面向 .NET 11 的项目,默认语言版本就是 C# 15。整个预览周期里打磨的语言特性全部转正:

  • 联合类型(union types)
  • 带标签的 break / continue
  • 集合表达式参数(collection expression arguments)
  • 非虚静态接口成员
  • 封闭类层级(closed class hierarchies)
  • 扩展索引器

Union 类型毕业

以前想表达"一个方法可能返回成功或失败",要么搞异常,要么手写 OneOf 风格的包装类。现在原生支持,而且不再需要 <LangVersion>preview</LangVersion>

public record Success(string Message);
public record Failure(int ErrorCode);

public union Result(Success, Failure);

static string Describe(Result result) => result switch
{
    Success(var message) => message,
    Failure(var errorCode) => $"Error {errorCode}"
};

带标签的 break/continue

写过嵌套循环的人,谁没为了跳出外层循环搞过 bool found = false 的 flag 大法?现在可以直接:

outer: for (int x = 0; x < xMax; x++)
{
    for (int y = 0; y < yMax; y++)
    {
        if (GetValue(x, y) == target)
        {
            break outer;   // 直接跳出外层循环!
        }
    }
}

Unsafe Evolution 继续打磨(仍为预览特性)

内存安全规则(updated-memory-safety-rules)这一版补齐了几块拼图:await 现在可以出现在 unsafe 上下文里;safe 关键字可以标注在 LibraryImport 这类生成代码上;而给委托、静态构造函数、析构函数标 unsafe 则会直接报错——因为它们本来就不构成有意义的 unsafe 上下文。


二、基础库:跨平台能力大补课

进程信号与退出状态

Process 终于原生支持发送 POSIX 信号和检查终止状态了,不用再绕 SafeProcessHandle

using System.Diagnostics;
using System.Runtime.InteropServices;

if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS())
{
    using Process process = Process.Start("sleep", "30")!;
    process.Signal(PosixSignal.SIGTERM);
    ProcessExitStatus status = await process.WaitForExitStatusAsync();
    Console.WriteLine(status);
}

ProcessExitStatus 能区分"正常退出"和"被信号干掉",做进程管理的同学狂喜。

Linux 上的类型化 DNS 解析

Preview 7 引入的 Dns.ResolveSrvResolveMxResolveTxtResolveCName 等强类型 DNS API(当时仅 Windows 实现),这一版 Linux 也安排上了,基于平台解析器配置,还支持自定义 DNS 服务器列表。微服务和服务发现场景实用性拉满。

JSON:新数值类型 + Union 序列化

System.Text.Json 内置了 BFloat16Decimal32Decimal64Decimal128 的转换器(反射和源生成都支持)。同时 JSON 基础设施完成了对 C# union 类型的支持——通过结构分类器,可以按"区分属性"自动判断该反序列化成 union 的哪个 case:

[JsonUnion(TypeClassifier = typeof(JsonUnionTypeStructuralClassifier))]
public union PetUnion(Dog, Cat);

另外,封闭类型层级的多态序列化现在可以通过 [JsonPolymorphic(InferClosedTypePolymorphism = true)] 按类型逐个开启,库作者不用强迫使用者改全局 JsonSerializerOptions 了。

异步选项验证

配置验证支持异步了:实现 IAsyncValidateOptions<TOptions>,启动时就能做"DNS 解析得通才算配置合法"这类检查。相应地,IStartupValidator 被标记过时,由 IAsyncStartupValidator 接替。

小而美的改进

  • BitArray 可以直接从 ReadOnlySpan<bool/byte/int> 构造——Arm64 基准快 33~51%,布尔输入的分配最多降低 89%
  • DeflateEncoderGZipDecoder 等无流编解码器新增 Reset(),处理多个载荷不用反复分配
  • Unix 上支持 TLS channel binding 校验,为 ASP.NET Core 的 Negotiate 认证扩展保护(Extended Protection)铺路
  • Apple 平台上 AesGcmChaCha20Poly1305 走 CryptoKit 空 AAD 快速路径,16 字节小载荷加密提速约 25%
  • Aes 新增 RFC 3394 无填充 Key Wrap 支持(JOSE 库常用)

还有一个实验性大招:System.Net.Security 提供了调用方驱动的非阻塞 TLS 状态机TlsBufferSession / TlsSocketSession),应用自己控制缓冲区和 I/O 调度——做高性能网络中间件的可以关注,注意 API 带 SYSLIB5007 实验诊断。


三、运行时

  • Unix 进程内崩溃报告:崩溃时能从进程内部直接产出诊断信息
  • Half 运算用上 FP16 硬件指令:半精度浮点操作在支持的芯片上直接硬加速

回顾整个 .NET 11 周期,运行时的"头号工程" Runtime Async(运行时原生异步)已经从 Preview 1 一路打磨到反超传统状态机模型:异步方法进入分层编译后,TechEmpower JSON 基准预热阶段的分配速率暴降 92%;热路径 await 内联后循环一亿次从 191ms 降到 32ms。再加上 CoreCLR on WebAssembly 已能端到端跑完整个运行时库测试套件——Blazor WebAssembly 换上 CoreCLR 的日子越来越近了。


四、SDK 与 CLI

dotnet test 全面加强

RC1 的 dotnet test(Microsoft.Testing.Platform 路径)新增两组运行级控制(放在 -- 之前对整个运行生效):

# 整个测试运行最多 90 秒
dotnet test --timeout 90s

# 挂 5 个就止损
dotnet test --maximum-failed-tests 5

移动测试也支棱起来了:支持 Android、iOS、macOS、Mac Catalyst 目标,可以选择真机、模拟器,还有配套的 dotnet new androidtest / iostest 等模板。多模块运行时可以用 --results-directory-layout per-module 防止同名报告互相覆盖。

容器发布:可复现 + 跳过冗余上传

  • 设置 SOURCE_DATE_EPOCH 后,相同输入的多次发布会产出相同的镜像摘要(digest),供应链审计友好
  • 推送到远端仓库前会先检查 manifest 是否已存在,已存在则跳过层处理只打标签,重复推送快得多

文件化应用(File-based Apps)继续进化

单文件 app.cs 的 Native AOT 启动路径现在能复用已有构建产物——没改代码就不用重编译。dotnet format app.cs 也可以直接格式化单文件应用了。

dotnet format 提速

文件夹模式下,dotnet format 只沿"将被格式化的文件"的祖先目录查找 .editorconfig,不再扫描 node_modules 这种无关子树。某 monorepo 基准里,格式化单个文件从 1.09 秒降到 0.55 秒。


五、ASP.NET Core

  • SignalR 认证刷新 API 定型:服务端 API 和 TypeScript 客户端双双支持认证刷新,Blazor Server 电路在认证刷新后也会自动更新——为 Azure SignalR 等场景铺路
  • OpenAPI 会如实反映 [Obsolete] 标记的 API,并且可以为构建期 OpenAPI 生成选择环境
  • Negotiate 认证使用 TLS channel binding(配合前面提到的 Unix 端支持),防中继攻击

回望 Preview 7 里那些大货——Blazor 电路自动暂停省电、CacheView SSR 输出缓存、五个新 Blazor 分析器(BL0012~BL0016)、验证体系本地化内置——都已在 RC1 中趋于稳定。


六、MAUI 与桌面端

  • .NET MAUI:RC1 聚焦测试能力(对接 dotnet test 的设备测试)、控件与平台功能完善、XAML 改进;跨平台 Passkey、XAML 增量热重载、ASP.NET Core 风格的 Shell 路由模板等 Preview 7 重磅特性全部带上
  • Windows Forms:新增 kiosk(信息亭)模式管理能力,现代视觉风格(Modern visual styles)在 RC1 正式稳定

七、上手方式

  • 下载 .NET 11 SDK(RC1):https://dotnet.microsoft.com/download/dotnet/11.0
  • Windows 用户推荐搭配 Visual Studio 2026 Insiders;VS Code 用户安装最新 C# Dev Kit
  • 想看新特性演示,可以蹲每周的 .NET 社区 standup 和 .NET Unboxed 直播

升级提醒:RC1 仍有几处值得注意的破坏性变更——

  1. 数值转换严格正确舍入decimal 与二进制浮点之间的转换改为"精确值一次舍入"。double 字面量 1.23decimal 不再恰好得到 1.23且没有兼容开关——依赖旧结果的测试和序列化数据需要更新
  2. HTTP 高基数指标改为可观测仪表:直接用 MeterListener 的代码需要调用 RecordObservableInstruments 才能收到 open_connectionsactive_requests 的测量值
  3. Configuration 环境变量成为 CLI 默认值:脚本里如果设置了环境变量 Configurationdotnet build/test 会默认采用它而不是 Debug,需要时显式传 --configuration Debug

升级前建议通读一遍官方发布说明的 Breaking changes 部分。


1

写在最后

从 Preview 1 到 RC1,.NET 11 的拼图基本完整了:Runtime Async 反超状态机模型、CoreCLR 登陆 WebAssembly、CLI 全面 NativeAOT 化(dotnet tool list 快 5.5 倍)、C# 15 补齐 union 和 labeled break/continue、ZIP 加密、Blazor 省电摸鱼……

RC1 拿到 go-live 许可,意味着正式版已没有悬念,只剩抛光。这个 11 月的 STS 版本,诚意十足。

你最期待哪个特性?欢迎在评论区聊聊。

本文内容整理自微软官方 .NET 博客及 dotnet/core 仓库发布说明。