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

推荐订阅源

D
Docker
爱范儿
爱范儿
人人都是产品经理
人人都是产品经理
博客园 - 司徒正美
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
量子位
罗磊的独立博客
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
小众软件
小众软件
C
Cybersecurity and Infrastructure Security Agency CISA
Cyberwarzone
Cyberwarzone
大猫的无限游戏
大猫的无限游戏
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
雷峰网
雷峰网
Simon Willison's Weblog
Simon Willison's Weblog
The Cloudflare Blog
博客园 - 三生石上(FineUI控件)
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Cyber Attacks, Cyber Crime and Cyber Security
博客园_首页
博客园 - 叶小钗
V
Vulnerabilities – Threatpost
T
The Exploit Database - CXSecurity.com
T
Tailwind CSS Blog
IT之家
IT之家
博客园 - 聂微东
Spread Privacy
Spread Privacy
V2EX - 技术
V2EX - 技术
S
Security Affairs
宝玉的分享
宝玉的分享
V
V2EX
C
Cisco Blogs
博客园 - Franky
美团技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
月光博客
月光博客
S
Securelist
J
Java Code Geeks
Webroot Blog
Webroot Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
P
Proofpoint News Feed
Last Week in AI
Last Week in AI
L
LINUX DO - 热门话题
NISL@THU
NISL@THU
WordPress大学
WordPress大学
W
WeLiveSecurity
T
Threatpost
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
腾讯CDC
阮一峰的网络日志
阮一峰的网络日志

Cyberia

《C(金钱掌控)》观后感 - Cyberia 存储退潮 字体padding计算器 开源已死 如何写出优雅完整的音频元数据 自动化EAC音频抓取 起夜级家庭网络正在变得越来越重要 优化Powershell的启动时间 无JavaScript其实没有很重要 你不需要一个电纸书阅读器 文件分享的难题 为什么我不敢看都市 某科学的 SSH 算号指南 时代的辉夜姬 为什么 Pixi 是神 关于神椿的过去,当下以及未来,我的一点看法 Tahoe 的图标令人难评 The EVE of PUSHING LIMITS 在 Word 中通过制表符实现居中对齐等操作 编码之殇:前 Unicode 时代的 WAV 处理 sHELL 即地狱 WR1800K AX NAND 路由器刷入 Immortalwrt 一个 PWM 的世界 沉痛悼念复选框同志 字体焕新 独立博客自省问卷15题 答一答 解决 Visual Studio Code 内终端启动报错问题 (1) 简评《鱿鱼游戏》 Sword Art Online,以及它带来了什么 解决 Visual Studio Code 内终端启动报错问题 2024 年度总结 轻小说重度依赖 铃音之后 解决部分应用在 Windows 平台下端口被随机占用的问题 计算机科学中最困难的事:居中 宿舍场景下多人共用路由器下流量分流实践 Extra Decal Pre Processor 自动化处理 Amazon Music 文件 MD5 不一致问题 解决 MultiMC 无 Forge 版本的 Optifine 安装问题
C#在Windows UI开发中的衰落 - Cyberia
Nullpinter · 2026-06-16 · via Cyberia

其实这方面有个之前在Hacker News上的博客讲过了,但是我最近还是要气死了。总而言之,如果你想要开发一个小软件(单文件),那么你现在应该选择C++(MFC)、Rust(Winio)、Rust(windows-reactor,需要等待这个bug被修复),没有任何选择C#的理由。

在今年的Microsoft Build上你软又双叒叕重申了对UI开发的承诺,将WinUI3改名为WinUI并保证没有下一个UI框架了(first time?)。看到这我的内心毫无波动甚至还想再给MFC续一秒。然后Build上发了个大的,就是Rust上的WinUI3框架,windows-reactor,还有一个很好玩的VibeOS,没啥别的了。

在WPF推出后,C#上的UI framework基本上就已经变成了现在的样子,那个时候是C#3.0,现在是C#14。直到WinUI3出现,半死不活的C#拉了一坨大的,我们看看微软员工自己给出的对比(来自添加windows-reactor的PR):

指标RustC#(JIT)C#(PublishAOT)
从零构建11.0 s23.9 s50.8 s
部署体积3.34 MB128 MB163 MB
首个窗口出现时间160 ms465 ms364 ms
稳定后的工作集内存109.5 MB162.6 MB128.4 MB
私有内存101.0 MB121.0 MB117.3 MB
CPU 时间(启动 + 稳定)594 ms1,063 ms906 ms
重渲染时间(4,900 个单元格,10%)3.1 ms27.0 ms29.4 ms

真的是给我看笑了。windows-reactor理论上可以单文件发布(实际上最少三个文件,等修吧,winio是可以真单文件),而C#来写WinUI3不仅依赖又臭又长还大。

WinForms和WPF的问题#

第一关,你应该使用dotnet Framework还是dotnet?前者随Windows一起分发,但是性能和现代特性的支持都非常的烂;后者因为UI框架的原因无法使用AOT,要么打一个巨大的自包含EXE要么让用户手动安装运行时,好在没有运行时的时候还会弹窗让你下载(不过还是很阴间,因为Framework没有的时候会自动跳疑难解答安装不用手动下载)。

第二关,DpiAwareness。这关基本上把WinForms应用判了死刑,这东西做支持真的太狗屁了,不要尝试手动做。兼容模式和manifest有些时候也会不起作用。WPF在这方面则好一些,起码在大部分情况下Dpi是正常的,不会在你的高分屏上糊成一坨屎。

第三关,高低版本上的WPF库的兼容差异,以及GPU的引入。先不说你要遴选用的三方控件库或者DataConverter库,GPU这个东西有好有坏吧。其实WPF用GPU渲染挺好的,但是这会导致某些笔记本或者多显卡可弹出的台式电脑独显一直占用无法被关闭。使其不能够进入最省电的状态,占用GPU这块。然后默认的WPF主题也是很丑的,如果你用了ModernWPF这种库又会导致Designer和占用内存的大幅度提升,我还能说什么。

最后是大小。基本上,你无法在10M内发布整个软件,这对于一些工具软件来说是不可接受的。我只有一个窗口,用MFC来实现可能只要500K,但是用WPF可能就要十几个DLL+巨大的体积,所以这两个东西真的很不好用,当然企业级应用用着没问题。

值得一提的是生命周期。Winforms早就已经进入维护模式,WPF一直半死不活偶尔诈尸一下,性能优化也不怎么吃的到。现在的新欢是MAUI(以前叫Xamarin),但是这东西手感一坨,也是又大又垃圾,令人忍俊不禁。

MFC和Avalonia#

MFC是个老东西了,会写的人都知道坑点在哪里。至于Avalonia,我建议你可以看看Flutter,这两个原理上都差不多,但是目前来说Flutter提供了更高的自由度。

MFC说实话真的应该被淘汰了。先不说被喷烂的Windows + C++开发;手动处理并分发Win32消息循环,手动处理UI线程和工作线程的切换,手动处理DpiAwareness,手动处理高分屏适配就已经很恶心了。MFC过于底层,非常的新手不友好,而且会非常容易写出来一个屎山项目。

View/Document模型也已经实际上过时了。总之从现代性的角度来看MFC已经输了一切。但是它实在太小了,依赖也太少了,一个vcrt就解决了,基本上不会缺。性能也好,只要你能够正确的写出App,这基本上是Rust方案出现前的唯一选择了。

Avalonia,阿瓦隆。确实是一个幻想中的地方。这东西依赖Skia,所以不可能单文件部署,而且性能也挺差的,不如看看隔壁Flutter。

C#与MFC#

我之前写小东西的时候都想笑。我居然在C# AOT的ConsoleApp中call kernel32和user32来做UI。这大概率是C#中写出最小GUI应用的方法了吧。当然还有个叫cs-gui的TUI库,总之也一般。

MFC的特点是,if you want it, then you have to take it。什么组件都需要自绘。看xxx不爽?不好意思没有主题自绘去吧。无障碍和响应式则是根本想屁吃。不过起码是一个非自绘原生应用,不是吗?

Electron和Tauri#

先说结论:很少有人用Tauri上生产,这个东西真的烂到家了。所以你只能选Electon(电子)。

是啊,电子垃圾。这东西能够在和WinUI3原生框架差不多大小的发布大小中塞入更多先进的特性,并且提供更好的性能。谁会在乎一个小工具居然要占用200M空间呢?进入AI时代后,因为AI真的很会写前端,Electron也越来越成为了一个开发首选项,虽然在AI时代来临前大家都在用Electron了。

Fun fact:React Native相较于C#,离WinUI3更近。

最后#

不难看出,C#似乎并不关心Windows UI开发,这倒也符合微软一贯以来的尿性。在CLI,TUI和Web Server上(甚至包括前端),C#都工作的不差,除了最本职的Windows开发以外,在别的平台也过的挺好的。

我不知道下一个良好的C# UI framework到底是什么,但是至少不会是现在的这些。让我们把应用重写到Rust吧。

一个更大的议题是原生应用的衰落,但是我确实不怎么了解其他平台的问题,虽然知道问题很大。一些神经病公司也开始转向跨平台框架(弱智小米的新的安卓桌面是Flutter写的你敢信,大小性能还有手感全部稀烂),似乎没有人在关心原生应用了。All in Web和Web类似物喵。