大家好,我是码农刚子。

从 2001 到 2026,Mono 完成了它的历史使命。.NET MAUI 移动应用首次跑在 CoreCLR 运行时上。

引言:一个时代的结束,一个新时代的开始

2026 年 5 月 12 日,微软发布 .NET 11 Preview 4。与以往版本不同,这个预览版包含一个足以载入 .NET 移动开发生涯的重大变更——自 .NET 11 起,CoreCLR 正式成为 Android、iOS 和 Mac Catalyst 平台上 .NET MAUI 应用的默认运行时

这意味着,Mono 在 .NET MAUI 移动端的 25 年征程画上了句号。Xamarin 时代延续至今的技术栈,终于迎来了彻底的统一与重塑。

用微软首席产品经理 David Ortinau 的话来说:“你的移动应用现在运行在和 ASP.NET Core、Azure 服务、桌面应用一样的运行时上,而这个运行时正驱动着全球数以百万计的生产工作负载。

这不仅是技术栈的更换,更是 .NET 统一大业中最重要的一块拼图。

Mono:成就 .NET 移动时代的功臣

要理解这次迁移的意义,得先回到 2001 年。

彼时,Miguel de Icaza 启动了 Mono 项目,目标只有一个——把 .NET 带到 Linux 上。谁也没想到,这个开源项目最终能走这么远:

  • 2009 年:MonoTouch 将 C# 带到了 iPhone
  • 2011 年:MonoDroid 紧随其后,登陆 Android 平台
  • Xamarin 将这些“实验”变成了一个平台,服务了数百万开发者
  • 2016 年微软收购 Xamarin,开启了通向 .NET MAUI 的旅程。Mono 就是支撑这一切的运行时

Mono 的影响力远不止于微软的产品。Unity 游戏引擎基于 Mono 构建脚本运行时,为全球最受欢迎的游戏引擎和数以百万计的游戏提供动力。Avalonia UI 依赖 Mono 将 .NET 桌面应用带入 Linux,Uno Platform 在 WebAssembly 上借助 Mono 实现跨平台浏览器应用,MonoGame 传承着 XNA 的衣钵。Godot 引擎的 C# 脚本后端同样由 Mono 驱动。

正如 Ortinau 在技术博客中写下的这句话:

Mono 让这一切成为可能。CoreCLR 成为 .NET MAUI 的默认运行时,不是这段历史的终结,而是新篇章的起点。

Mono 成就了 .NET 的“无处不在”,如今轮到 CoreCLR 接过接力棒,跑向更远的地方。

核心变更:哪个平台切换了,哪个没变

具体来说,当你的 .NET MAUI 应用面向 .NET 11 构建时,对于 Release 和 Debug 构建(无论哪种构建模式),CoreCLR 都会自动成为 Android、iOS 和 Mac Catalyst 平台上的默认运行时。

这并非毫无铺垫的“大跃进”。

微软一直在为跨平台扩大 CoreCLR 的疆域——从最初的 Windows,到 Linux、macOS(AppKit),再到 Android。而 .NET 11 Preview 4 中最大的不同在于,我们把同一个 CoreCLR 运行时扩展到了 Android、iOS 和 Mac Catalyst 平台,这些正是 .NET MAUI 中曾经还依赖 Mono 的最后几个平台。

几点重要澄清需要开发者注意:

  • 涵盖的平台为 Android、iOS、Mac Catalyst 和 tvOS,全都迁移到 CoreCLR。
  • Blazor WebAssembly 不受影响——WASM 继续使用 Mono,且 .NET 11 中不会改变。
  • 如果在迁移期间遇到问题,你还可以选择切回 Mono——至少在 .NET 11 阶段是支持回退的。

💡 特别说明:当你使用 NativeAOT 发布应用时,应用既不跑在 Mono 上,也不跑在 CoreCLR 上——它跑在一个最小化的 NativeAOT 运行时环境中,并静态链接到你的原生二进制文件中。NativeAOT 是无运行时(runtime-less)的极端优化,启动速度和二进制大小都具备明显优势。

三大驱动力:为什么要切换到 CoreCLR?

微软官方给出了三大原因,清晰而有力。

第一:运行时统一

此前,.NET 移动应用运行在 Mono 上,而服务端、桌面和云端应用运行在 CoreCLR 上。这种分裂意味着:

  • 不同的 JIT 行为
  • 不同的 GC 行为
  • 不同的 bug surface
  • 开发者在不同场景下需要面对两套“脾气迥异”的运行时

如今几乎所有的 .NET 11 工作负载共享同一个运行时,有着相同的行为、特性、工具链和错误处理机制。代码在服务端的表现,基本在移动端也一样。

第二:性能提升

CoreCLR 带来了比 Mono 更好的整体性能。微软在 .NET 10 中已经将 CoreCLR 作为 Android 的实验性选项,收到的反馈是启动时间和吞吐量都有明显提升。

迁移后,.NET MAUI 应用在所有平台上都能享受到 CoreCLR 的高性能 JIT 编译器、分层编译(tiered compilation)和完整的运行时诊断能力。

微软合作伙伴软件工程师 Stephen Toub 曾在 .NET 10 发布时就指出,CoreCLR 为 Android 带来了显著的性能改进和更快的启动时间。

而从 Mono 的实际架构看,Mono 虽然成熟、轻量、支持 AOT,但在 GC 开销和重度分配场景下容易遇到瓶颈。CoreCLR 采用更先进的 GC,元数据访问更快,分层编译等机制让高频代码路径得到更好的优化。

第三:NativeAOT 编译的可用性

这是本次迁移中尤为值得关注的技术亮点。

CoreCLR 成为默认运行时,跨平台获得 NativeAOT 编译成为可能

你不再受限于 Mono 的 AOT 实现,而是可以直接使用 .NET 的 NativeAOT 工具链来发布应用。NativeAOT 将应用与一个最小化的运行时一起静态编译成原生二进制,启动时间更短、内存占用更低、应用程序体积更小

尽管 .NET MAUI 早已在 Release 模式下默认使用 NativeAOT,但 CoreCLR 路径下对 NativeAOT 的支持更为成熟和完整。

这意味着开发者可以:

  • 获得更好的移动端启动性能
  • 二进制体积更受控制
  • 部署到应用商店时遇到的安全和性能审查也更容易通过

社区回声:Unity 早已先行

微软并不是唯一一家对 Mono 说“再见”的公司。游戏引擎巨头 Unity 也已经开始了自己的 CoreCLR 迁移,将其脚本运行时从 Mono 转向 CoreCLR。这说明 CoreCLR 在游戏和移动领域的价值得到了更广泛的印证。

David Ortinau 在宣布这一消息时的一段话特别动情:

我想向 Mono 生态圈的所有人致敬:用 Unity 和 MonoGame 的游戏开发者;用 Avalonia 和 Uno Platform 的跨平台团队;那些早就证明 C# 属于移动端的 Xamarin 开发者。Mono 让一切成为可能,它的 DNA 依然流淌在 CoreCLR 对移动端的支持中。Mono 指引我们走到了这里,CoreCLR 将带我们走向更远的地方。

对开发者的影响和行动指南

需要做什么?

.NET 11 Preview 4 默认使用 CoreCLR,大部分现有 .NET MAUI 项目在新 SDK 下构建时会自动切换。微软建议你在测试环境中尽早尝试,确保现有应用平滑过渡。

如何回退到 Mono

在 .NET 11 时间范围内,如果你在迁移过程中遇到问题,可以通过配置切回 Mono:

<PropertyGroup>
    <UseMonoRuntime>true</UseMonoRuntime>
</PropertyGroup>

⚠️ 但请务必注意,这只是过渡方案,Mono 在移动端的支持不会无限期延续下去。

如何开始使用

想要体验 .NET 11 Preview 4,可以:

  1. 安装 .NET 11 SDK
  2. Windows 用户推荐使用 Visual Studio 2026 Insiders
  3. VS Code 用户配合 C# Dev Kit 扩展即可

⚠️ 预览版不适合生产环境,仅供评估与测试。

更深层的生态位:Mono 不会消失

Mono 不会完全消失——微软仍会在 .NET 代码库中维护 Mono 运行时,以支持 WebAssembly 等特定场景

在 .NET 11 中,CoreCLR 正在成为 Android 的默认运行时,并启动了将 CoreCLR 引入 WebAssembly 的初步工作,以最终替代 Mono。这是一个漫长的过程,但方向明确。

同时,MAUI 本身也带来了其他质量优化:

  • 惰性 ResourceDictionary 生成:XAML 源生成现在将资源字典条目注册为工厂,按需膨胀而非启动时全部加载——大型应用的资源字典初始化时间可提升约 8 倍
  • CSS 支持完全可修剪:如果应用不使用 CSS 样式表,CSS 基础设施将在发布时被修剪掉,应用体积进一步减少;
  • InvalidateStyleInvalidateVisualStates 新 API,让动态样式和视觉状态的重用更简单,尤其适合热重载场景。

总结:这不是告别,而是演进

从 2001 年 Mono 开源项目启动,到 2026 年 CoreCLR 成为 .NET MAUI 的默认运行时——25 年光阴,一个技术生态完成了它的演进轮回。

如果说 Mono 让 C# 第一次跑遍 Linux、Android、iOS,那么 CoreCLR 则让 .NET MAUI 真正融入微软 .NET 大一统的主流运行时路线图。

这次迁移或许短期内会带来一些小阵痛(例如部分底层依赖 Mono 特性的库可能需要适配),但长远看——运行时统一意味着更低的维护成本、更一致的行为、更强的性能,以及 NativeAOT 带来的新想象空间。

对 .NET MAUI 开发者而言,CoreCLR 迁移不是一次额外的麻烦,而是一个未来十年的性能与统一性跳板。

现在,是时候尝鲜 .NET 11 Preview 4,把自己的移动应用放在 CoreCLR 上跑一跑,迎接 .NET 统一的下一站。

我是刚子,一个写了六年 .NET 代码的程序员。