做桌面应用时,第一个真正影响整个项目生命周期的问题,通常不是“界面怎么画”,而是: 到底用什么框架? Windows 有 WinUI、WPF,macOS 有 SwiftUI、AppKit,Linux 有 GTK、Qt;如果不想维护三套代码,又会遇到 Electron、Tauri、Flutter、Qt、Avalonia、.NET MAUI…… 看起来都能“做桌面 App”,但它们底层的运行方式其实完全不同。 有的直接调用操作系统原生 UI,有的自己绘制界面,有的塞进一个 Chromium,还有的借助系统 WebView。 这篇文章就从桌面应用的技术路线出发,把目前主流方案梳理清楚。
一、桌面应用框架其实可以分成四类
如果从底层实现方式看,目前桌面开发大致可以分成四条路线:

这四类方案没有绝对的优劣。 真正应该问的是: 你的应用更在意原生体验、跨平台效率、开发成本,还是运行资源?
二、Windows:WinUI 3正在成为新项目主线
1. WinUI 3
如果现在从零开发一款新的 Windows 原生桌面软件,微软当前推荐的路线是: Windows App SDK + WinUI 3。 WinUI 3 是微软推荐的新 Windows 桌面原生 UI 框架,支持 C#、C++ 和 XAML,并延续 Windows 11 的 Fluent Design 设计体系。 典型技术栈:
C# / C++
↓
WinUI 3
↓
Windows App SDK
↓
Win32 / WinRT
↓
Windows它特别适合:
Windows 专属生产力工具
系统管理工具
企业客户端
对 Windows API 调用较多的软件
对 Fluent Design 有要求的应用
优势是系统融合度高、性能好,对窗口、通知、文件系统、剪贴板、任务栏等 Windows 能力支持直接。 缺点同样明显: 它基本就是为 Windows 服务的。 官方也明确指出,WinUI 3 并不是跨平台框架。
2. WPF
WPF 已经是 Windows 桌面开发里的“老将”。 典型技术栈:
C#
+
.NET
+
XAML
+
WPF它最大的价值不是“新”,而是:成熟。 企业管理软件、工业软件、客户端工具、内部业务系统里仍然存在大量 WPF 项目。 因此如果你维护已有 .NET 桌面系统,没有必要看到 WinUI 3 就立刻重写。 微软目前的策略同样允许 WPF、WinForms、Win32 项目逐步接入 Windows App SDK 的现代能力。 可以简单理解成:
Windows 新项目
↓
WinUI 3
大量传统项目
↓
WPF / WinForms三、macOS:SwiftUI + AppKit
到了 macOS,技术路线反而相对清晰。
1. SwiftUI
苹果目前的新项目重点已经明显转向 SwiftUI。基本结构:
Swift
↓
SwiftUI
↓
Apple Frameworks
↓
macOSSwiftUI 使用声明式 UI:
struct ContentView: View {
var body: some View {
Text("Hello Mac")
}
}与 React、Flutter 的开发思想比较接近。苹果目前将 SwiftUI 定位为构建新 Apple 平台应用的重要方案,而且同一套 SwiftUI 体系还可以覆盖 macOS、iOS、iPadOS 等 Apple 平台。 如果你的软件只服务 Apple 生态,SwiftUI 通常是一条非常自然的路线。
2. AppKit
但 SwiftUI 并没有让 AppKit 消失。AppKit 是传统 macOS 桌面应用的核心 UI Framework,负责窗口、菜单、控件、事件、打印、文档等大量经典桌面能力。( 很多复杂 macOS 软件实际采用的是:
SwiftUI
+
AppKit四、Linux:GTK 与 Qt 两大体系
Linux 桌面的情况要复杂一些。Windows 基本围绕微软技术栈,macOS 围绕苹果技术栈,而 Linux 本身存在 GNOME、KDE 等不同桌面环境。其中两个非常重要的 GUI 技术体系就是:
GNOME → GTK
KDE → Qt1. GTK
GTK 是一个开源 GUI Toolkit,目前稳定主线为 GTK 4。在 Linux 上,GTK 与 GNOME 生态结合尤其紧密。官方同时提供 GNU/Linux、Unix、Windows 和 macOS 支持,因此 GTK 本质上也具有跨平台能力,只是在 Linux 桌面生态中的存在感尤其强。适合:
Linux 原生工具
GNOME 应用
系统管理软件
开源桌面程序
如果目标用户主要就是 Linux 用户,GTK 是很值得考虑的一条路线。
五、Qt:跨平台桌面开发里的传统强者
Qt 的历史已经非常长,但它至今仍是桌面跨平台开发的重要方案。Qt 可以开发:
Windows
macOS
Linux
移动端
嵌入式设备官方支持在 Linux、Windows 与 macOS 上开发,并面向多种操作系统和硬件部署。经典技术栈:
C++
↓
Qt
↓
Qt Widgets / QML
↓
Windows / macOS / Linux现在也常见:
C++
+
QML
+
Qt Quick六、Electron:把 Web 技术搬进桌面
如果过去十年谈“跨平台桌面框架”,Electron 基本绕不开。Electron 的基本结构非常直白:
React / Vue / HTML
↓
Chromium
+
Node.js
↓
Windows / macOS / LinuxElectron 会把 Chromium 和 Node.js 放进应用运行环境,因此开发者可以直接使用:
HTML
CSS
JavaScript
TypeScript
React
Vue
Svelte开发桌面软件。官方目前仍明确支持 Windows、macOS 与 Linux。这也是 Electron 最大的价值: Web 开发团队几乎不需要重新学习一套 UI 技术。 很多复杂桌面软件都可以采用:
React
+
TypeScript
+
Electron完成。
Electron为什么一直被吐槽“重”?
原因其实就在架构里:
每个 Electron App
↓
携带 Chromium
+
Node.js好处是环境一致。你的 CSS、JavaScript、DOM 在不同操作系统上的表现相对可控。代价则是:
安装包通常更大
内存占用更高
启动成本可能更高
所以 Electron 本质上是在做一个交换: 用更多运行资源,换取更高的开发效率和更统一的跨平台体验。
对于 IDE、知识管理、AI 客户端、聊天工具、协作软件,这种交换很多时候完全可以接受。
七、Tauri:Web桌面应用的另一条路线
Tauri 经常被简单描述成:“轻量版 Electron。”
这个说法方便理解,但并不完全准确。两者真正的区别在底层。Electron:
Web UI
↓
Chromium
↓
Node.js
↓
OSTauri:
Web UI
↓
系统 WebView
↓
Tauri
↓
Rust
↓
OSTauri 不再给每个应用完整打包一个 Chromium,而是利用操作系统现有的 WebView。例如 Windows 会使用 WebView2。它的应用逻辑通常可以写在 Rust 中:
React / Vue / Svelte
↓
WebView
↕
IPC
↕
Rust
↓
OSTauri 2 当前支持 Windows、macOS 和 Linux,同时已经扩展到 Android、iOS。
Tauri真正吸引人的地方
不是单纯“包小”。而是: Web UI + Rust 系统能力。 这让它比较适合:
AI 客户端
开发者工具
本地文件工具
下载器
系统辅助工具
数据处理客户端
网络工具
尤其是已经拥有 React / Vue 前端,而桌面端还需要较多本地能力的项目。当然它也不是免费午餐。 因为不同操作系统使用不同 WebView,WebView 行为并不像 Electron 内置的 Chromium 那么完全统一。 同时,一旦深入 Rust、IPC、系统权限、插件和平台适配,工程复杂度也会逐渐上升。
八、Flutter:不是Web,也不是传统原生控件
Flutter 又走了另一条路线。它不像 Electron 那样依赖 HTML DOM,也不是简单包装 Windows、macOS 原生按钮。它拥有自己的 UI 和渲染体系。 可以粗略理解:
Dart
↓
Flutter Framework
↓
Flutter Rendering
↓
Windows / macOS / LinuxFlutter 官方目前支持直接编译 Windows、macOS 和 Linux 桌面应用,同时插件体系也支持这些桌面平台。 它最大的特点是:UI一致性非常强。 如果你希望:
Android
iOS
Windows
macOS
Linux尽可能共享一套 UI 与业务代码,Flutter 的价值会明显提高。特别适合:
多端消费级产品
工具类应用
UI高度定制的软件
已经使用 Flutter 开发移动端的项目
但如果应用大量依赖非常传统的桌面交互、复杂系统菜单、深层 OS API,那么仍然可能需要编写平台插件。
九、Avalonia:.NET开发者值得关注的桌面跨平台方案
如果团队的核心技术栈是:
C#
.NET
XAML那么除了 WPF 和 .NET MAUI,还有一个非常重要的选择:Avalonia。 它的思路和 WPF 很接近:
C#
+
AXAML
+
.NET但目标平台扩大到了:
Windows
macOS
Linux
iOS
Android
WebAssembly官方目前将 Windows、macOS、Linux 都纳入支持体系。Avalonia 的另一个重要特征是: 它不是简单包装三个平台的原生按钮,而主要通过 Skia 自己绘制控件。 因此同一套 AXAML、ViewModel 和样式可以在多个平台保持比较统一的表现。 对于原本熟悉:
WPF
MVVM
C#
XAML的团队来说,迁移思维成本通常比突然切到 Electron、Rust 或 Flutter 更低。
十、.NET MAUI:一定要注意Linux支持问题
.NET MAUI 经常也会被列进桌面跨平台框架。但这里有一个特别容易产生误解的地方。 .NET MAUI 官方主要平台包括:
Android
iOS
macOS
Windows其中:
Windows → WinUI 3
macOS → Mac Catalyst微软官方支持列表目前并没有把 Linux 作为标准 .NET MAUI 应用目标。虽然目前已经存在基于 GTK4 的 Linux 实验后端,但微软明确将这一类后端标记为:Experimental。 所以如果需求明确写着:
Windows + macOS + Linux 三端桌面正式支持
那么现阶段不应该简单地因为“.NET MAUI 是跨平台”就直接选它。 .NET MAUI 更适合:
Android
+
iOS
+
Windows
+
macOS十一、把主流框架放在一起比较
可以把目前比较常见的方案总结成下面这张表:

需要注意,这里的“✅”只代表框架具备对应平台支持,并不意味着三个平台的能力、成熟度和开发体验完全相同。
十二、Electron和Tauri到底怎么选?
这是目前很常见的一组比较。如果项目本身已经是:
React
+
TypeScript两者都很好接。 Electron更像:
Web App
+
完整桌面运行环境优势:
生态成熟
npm生态直接使用
Chromium环境统一
大型项目案例很多
Web开发者上手快
Tauri更像:
Web UI
+
Rust Native Backend优势:
安装包可以更小
通常资源占用更低
Rust可以承担系统逻辑
系统能力边界设计更明确
所以不要简单理解成:Tauri一定比Electron好。
更准确的说法应该是:
重Web生态、成熟度
↓
Electron
重体积、系统能力、Rust
↓
Tauri十三、如果追求真正的原生体验呢?
如果软件只服务一个平台,答案其实会简单很多。
Windows
C#
+
WinUI 3macOS
Swift
+
SwiftUI
+
必要时 AppKitLinux / GNOME
GTK最大的优势就是系统融合。文件选择器、菜单、快捷键、通知、窗口、辅助功能、系统主题等,都更容易遵循平台自身的交互习惯。代价也很明显。 如果突然有一天产品经理说: “下个月顺便支持一下另外两个系统。” 开发团队可能就笑不出来了。
十四、如果必须同时支持Win、Mac、Linux
这时候可以优先从下面几个方向考虑。
Web技术团队
Electron
TauriC++团队
QtDart / 多端团队
FlutterC# / .NET团队
Avalonia这比单纯比较“哪个框架性能最高”更有实际意义。因为框架选型从来不只是 Benchmark。真正影响成本的是:
团队现有技术栈
+
第三方库生态
+
系统API需求
+
UI复杂度
+
发布渠道
+
后续维护周期十五、一个桌面应用最终其实有三层
无论采用什么框架,现代桌面程序基本都逃不开三个层次:
┌──────────────────────┐
│ UI Layer │
│ React / SwiftUI / QML│
├──────────────────────┤
│ Application Layer │
│ 业务逻辑 / 状态 / IPC │
├──────────────────────┤
│ Native Layer │
│ 文件 / 网络 / OS API │
└──────────────────────┘真正决定框架选型的,往往不是第一层。而是第三层: 你的程序到底需要多深地进入操作系统? 如果只是一个 API Client:
Web UI
+
HTTPElectron、Tauri 都很好做。如果是复杂系统工具:
进程
文件系统
驱动
硬件
窗口控制
系统事件Native 层的重要性就会迅速增加。
十六、2026年的桌面开发正在出现一个明显趋势
过去桌面开发经常是:
Windows程序 → Windows技术
Mac程序 → Apple技术
Linux程序 → Linux技术现在越来越多项目变成:
Web / Declarative UI
↓
跨平台业务逻辑
↓
少量 Native Adapter
↓
Windows / macOS / LinuxElectron 把 Web 带进了桌面。 Flutter 把自绘 UI 带进了多端。 Avalonia 把 .NET/XAML 推向更多平台。 Tauri 又尝试把 Web UI 与 Rust Native Backend 结合。 桌面应用正在从“某个平台的软件”,逐渐变成: 一个跨平台业务核心,加若干平台适配层。
十七、最后怎么选?
可以先用一个非常简单的决策树。
只做 Windows?
│
└── WinUI 3 / WPF
只做 macOS?
│
└── SwiftUI + AppKit
主要做 Linux?
│
└── GTK / Qt
Windows + macOS + Linux?
│
├── Web技术栈 → Electron / Tauri
│
├── C++ → Qt
│
├── C# → Avalonia
│
└── Dart → Flutter
移动端 + 桌面端同时做?
│
├── Flutter
└── .NET MAUI