上次写完CefSharp应用Demo,评论区和私信问题主要集中在两个:一个是问为什么套个浏览器,直接WPF做不行吗;一个是问为什么不用WebView2。
那我干脆这篇把三个放一起讲,看完你的项目该用哪个,基本不用再纠结了。
WPF、WinForms是原生UI,界面用XAML、拖控件画出来,渲染走的是系统这层的绘制体系;WebView2、CefSharp是壳+网页,窗口里嵌一个Chromium,界面用HTML/CSS/JS写,C#只管底层。
这一层差别直接确定了开发分工、包体积、部署方式。
原生渲染,不依赖任何浏览器,装完就跑。包也小,framework-dependent发布就几MB,self-contained也就几十MB,启动速度和内存占用是三个方案里最舒服的。
数据绑定、模板、动画XAML写起来很爽,复杂表格、多面板停靠这种很顺。UI和业务在同一个工程里,没有JS、C#互调这一层。
短板在UI开发成本:XAML有上手门槛,会写的人不如会写网页的多;现代化界面要做圆角卡片、流畅动效、流式布局,XAML能做但很费时间;前端同事想帮忙就得从0开始学。
适合的场景:工控上位机、医疗影像、长期挂机的监控软件,这类应用界面稳定、对性能和内存敏感,WPF反而是最优解。
拖控件开发是真的快,一个内部工具一天就能出活;资料多,老程序员都会;稳定,这套东西二十年没大变,十年前代码都能用。
问题是观感就停在上个时代,默认那套控件UI太复古;改皮肤、自定义绘制要费很大劲;流式、自适应这类布局基本靠手写坐标,后期维护痛苦。
我的建议:给运维、给实施用的配置面板、设备调试小工具,WinForms照样香;对外交付的新项目,慎重。
微软官方方案,窗口里嵌Edge内核。界面交给前端,Vue、React也能上,换肤换版只动UI层;Win10较新的版本和Win11基本预装了运行时,还跟着系统自动升级,你的程序本体只有几MB,AnyCPU都行,不用像CefSharp那样锁死x64。
代价有两个。
一是内核不打在你包里,机器上没装运行时,程序起来就是白屏,发布前要自己检测、引导安装。
二是Evergreen自动升级,版本不完全归你控制。你在131上测好的页面,用户机器哪天升到137,某个CSS行为变了,就会导致错乱。
互调用postMessage和ExecuteScriptAsync:页面window.chrome.webview.postMessage发消息回C#,C#用ExecuteScriptAsync执行JS。够用,但比CefSharp的BindObjectAsync啰嗦一些。
适合的场景:面向普通用户联网分发的软件、企业内部系统的客户端、界面迭代快的业务系统。机器Win10/11、能联网、在意安装包大小,选它。
把整个Chromium(CEF)打进你的发布目录,走哪带哪。好处是离线机器友好:发包即用,版本你自己锁死,几百台机器渲染表现完全一致,出问题能复现。医院自助机、工控屏、内网环境,这两条原则在就必须用。
互调用BindObjectAsync,C#对象直接暴露给页面,方法名小驼峰,强类型调用,写起来最舒服。CachePath、代理、自定义Scheme这些控制粒度也细。
代价:
不要管哪个技术更新,按这个顺序问自己:
当年公司医院自助机就是按这套走下来,最开始也是WPF,最后选择CefSharp:界面每家医院都不一样,必须前端做UI层,C#专注串口、读卡器、打印机;机器不让上外网,不允许装运行时,版本必须锁死,几百台机器批量Ghost一个镜像。所以最优选择就是CefSharp。
反过来,做个联网的门店系统、给内部用的业务客户端,选WebView2,包小;如果跨Linux、macOS,这三个都不行,去看下Avalonia、Tauri。
大家公司桌面端现在用的哪套,是什么项目,可以在评论区留言。
往期推荐