个人比较讨厌.NET ,
准确说是讨厌.NET 上的 GUI 框架,
因为个人认为.NET 的 GUI 框架破坏了 Windows GUI 的开发体验。
早年的操作系统基本是只提供一套很基础的 API ,比如 Unix ,Win32 虽然有提供 GUI 相关的,但也是比较简陋的。而进入二十一世纪以来,许多操作系统都开始提供更丰富的 API ,比如 macOS 的 Cocoa ,让开发者通过系统内置的 API 就能开发出美观、完善的应用。
但是微软在推出 Windows Vista 时并没有加入现代化的 API ,
而是同时推出了基于.NET 的 WPF 。
如果.NET 做得好那问题也不大,
但是长期以来.NET 不能直接使用 Win32 API ,需要自己手写声明。不同版本的 Windows
系统中.NET 版本不一致,要兼容多个系统版本,
要不然给旧系统安装新版本.NET ,
要不然只能用旧版本.NET 来写程序,没法用新特性。再者,WPF 默认主题直到现在都没有和 Win32 的主题统一,Win8 、Win10 、Win11 更新主题后,WPF 那个都显得很难看。
为什么微软要这么搞?我认为,把 WPF
跟.NET 捆绑,
是为了拉拢开发者去用.NET ,“你想要爽的开发体验,那就别用 Win32 了,
来用.NET 吧”。同时当年因为微软对生态的把控力度不强,Windows 上有很多别的语言 /编译器 /框架,给 Windows 本身加上一套丰富的 API ,很可能被竞争对手拿去发扬光大,所以不内置到系统中,而是独立出来。Windows 内部有一套微软私有的 GUI 框架,资源管理器、任务管理器等许多系统应用都有使用,就是不开放出来。
另一方面,.NET 没法轻松地调用系统 API ,WPF 不使用系统主题,大概是为了跨平台考虑。这么做有好处,
可以避免.NET 跟 Windows 捆得太死,比如 Swift 最初推出时基本是 macOS/iOS 专用语言,加上 macOS/iOS 的 API 很丰富,于是很多库就依赖系统 API ,后面 Swift 能跨平台了很难移植。
但是很多.NET 用户只是想快速开发一个 Windows only 的应用,想使用一些比较底层、高级的系统 API ,想要有接近原生的 UI 风格,.NET 用起来就很麻烦。这就好比苹果发布 Swift ,写 GUI 只能用 SwiftUI ,不能使用以前 xib 那套,界面风格还和系统不一致,要调用 objc API 要自己声明一遍。
现在新的 WinUI 稍有起色,微软又试图用 MAUI 来分裂了。我认为如果 MAUI 搞起来了,势必会有一堆基于 MAUI 而不是 WinUI 的控件、主题等出现,久而久之就没人给 WinUI 写代码了,都去写 MAUI 的代码了,
结果又是跟.NET 捆死。有的人可能会说,那微软自己搞的 React Native for Windows 不也类似吗?确实是这样,但是 React Native 是可以嵌入使用的,可以在现有的 C++或者 C#项目中嵌入一个 React Native 写的基于 WinUI 的界面,而 MAUI 据我所知没有这样的功能,即使要嵌入,.NET 运行时体积也十分庞大。而且 React Native 是用 js 写的,一些底层高性能的操作还是要依赖 C++,没有完全抢走生态的风险,如果换成 MAUI ,
可能底层代码也用.NET 写了。