V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
feirisu
V2EX  ›  程序员

Windows 下开发小应用 GUI,真的很难选方案

  •  3
     
  •   feirisu · 125 天前 · 12657 次点击
    这是一个创建于 125 天前的主题,其中的信息可能已经有所发展或是发生改变。
    今天想做一个简单的小 exe ,需要调用不少原生 Windows API ,想要尺寸小一些,不要有依赖,最好单文件。
    其次,UI 不想要 Win32 原生控件。

    没想到在 2024 年的今天,这个看似简单的问题是如此难找到一个完美符合要求的。

    1.c++ win32 原生,CreateWindow 后面要设 Font 、所有事件自己从处理循环里接。
    2.c++ MFC ,想要 UI 好看,Pass 。
    3.c#的 WPF ,是很方便,也有很多 UI 库,但是目前不能 AOT (正式版本),独立打包直接去到 100+M ,Pass 。
    4.c#的 Form ,UI 不好看,打包也很大,可以 AOT 但是基本是空程序才行,稍微复杂点因为 AOT 隐式启用裁剪,复杂点的代码就会启动不了。
    5.c#的 Avalonia ,UI 还行,和 Form 一样 AOT 后有可能启动不了,独立打包 60-80M 也有点大,独立的也还另外带 3 个 DLL ,最难受的是启动很慢,需要 2-3 秒左右的时间才出窗口。
    6.QT ,不熟 Pass 。
    7.MAUI(WINUI),都不想提。
    8.electron ,一堆文件,太重了。
    9.flutter ,需要很多原生代码,还是得自己写 c++,两头折腾,尺寸倒是比 c#的那几个小不少。
    10.易语言,会,但真的不想用。

    微软真的是不干人事,老老实实把 WPF 的 AOT 做好,不知道能造福多少客户端开发。

    想来想去,不如控制台得了,除了没 GUI ,尺寸小、单文件、无依赖都可以做到。
    第 1 条附言  ·  124 天前
    感谢大家的回复,思维开阔了很多,我确实有一点喜欢追求完美,但我相信很多喜欢编码的人都是这样。在写代码时,总会想到这代码能不能更简洁直观,编译出去的东西能否运行更快、体积更小、更漂亮。

    我是一个老 windows 开发了,写过的东西估计你们可能都用过,比如 10 年前最火的游戏都在用的某个 box ,我觉得我是喜欢写代码的。

    看到收藏数我就放心了,看来很多人可能有同样的疑惑。

    我为客户端开发感到遗憾,在 windows 的 GUI 开发上,这么多年微软的似乎都是停滞的,我们追求的体积小而美、快速、兼容性、加壳反破解等等,在微软看来似乎都是不值一提的,WPF 的 AOT 相关的提交,在几年前就有人提交代码上去了,直到上个月才被合进 main 分支,在微软看来,我们就是一群不肯进微软 Store 的小丑吧。

    可能终究还是要走向跨平台的目标,但是这个目标微软实现不了。

    最后,我觉得还是业务为先吧,适当放弃一些东西也不失为一种选择,还是先 Avalonia 了,再次感谢各位的建议!
    第 2 条附言  ·  124 天前
    使用了 avalonia 的 AOT ,将裁剪修改为如下,可以 AOT 后正常运行了

    <TrimMode>partial</TrimMode>
    <TrimmerSingleWarn>false</TrimmerSingleWarn>

    然后根据 https://github.com/AvaloniaUI/Avalonia/issues/9503 的方法,将附带的三个 dll 用 lib 静态链接的方式引入

    <ItemGroup>
    <DirectPInvoke Include="libHarfBuzzSharp" />
    <NativeLibrary Include="native\libHarfBuzzSharp.lib" Condition="$(RuntimeIdentifier.StartsWith('win'))" />
    <DirectPInvoke Include="libSkiaSharp" />
    <NativeLibrary Include="native\libSkiaSharp.lib" Condition="$(RuntimeIdentifier.StartsWith('win'))" />
    <DirectPInvoke Include="av_libglesv2" />
    <NativeLibrary Include="native\av_libglesv2.lib" Condition="$(RuntimeIdentifier.StartsWith('win'))" />
    </ItemGroup>

    实现了完美的单文件 AOT ,文件编译后尺寸为 68M ,加 UPX 壳以后为 23M ,已基本符合了我的预期,启动速度也有了大幅的提升。
    第 3 条附言  ·  15 天前
    哈哈!干!最后用基于.Net Framework 4.6.2 的 WPF 重写了,反正用户不多,基本也都是新版 win10 ,默认都是自带了这个版本的.Net Framework 的。

    说起来也挺搞笑的,为了 AOT ,最后不要 AOT 。
    122 条回复    2024-01-10 08:34:35 +08:00
    1  2  
    ysc3839
        101
    ysc3839  
       124 天前 via Android
    @PrinceofInj Win11 正式版还没有 WinUI 3 ,仅仅是测试版有
    allenby
        102
    allenby  
       124 天前 via Android
    qt 不错
    f14g
        103
    f14g  
       124 天前 via Android
    aardio
    cway
        104
    cway  
       124 天前
    不如用老古董 vb6 ,文件小,不依赖.net
    NobodyVe2x
        105
    NobodyVe2x  
       124 天前
    gxvsko
        106
    gxvsko  
       124 天前
    WalterHs
        107
    WalterHs  
       124 天前
    Kotlin Compose 跨平台
    chuhades
        108
    chuhades  
       124 天前
    weeei
        109
    weeei  
       124 天前
    为什么你的方案里有 MFC ,却没有 WTL ?
    Ethkuil
        110
    Ethkuil  
       124 天前
    - winform
    - webview2, 用 Web 写 GUI

    「 Windows 小应用」,对我来说,超过 10MB 都不能算轻便了……
    dianso
        111
    dianso  
       124 天前
    GO+WEBVIEW2
    andytao
        112
    andytao  
       124 天前
    GLib/GTK + Vala(C# 原生版)写跨平台应用挺好的呀

    袋鼠数据库工具 使用的技术栈依赖情况如下:
    ================================================
    袋鼠数据库工具 Multiple (开发版) 4.0.0.240104
    系统平台
    Windows 11 22H2
    编译器
    Vala 0.56.13
    GCC 13.2.0
    核心库
    GLib 2.78.1
    JSON-GLib 1.8.0
    libsoup 2.74.3
    OpenSSL 3.1.4
    GTK 4.12.4
    libadwaita 1.4.0
    libpanel 1.4.0
    GtkSourceView 5.10.0
    数据库连接库
    sqlite3mc 1.8.1
    libmysqlclient 3.1.13
    libmariadb 3.1.13
    libpq 16.1
    dblib 1.4.8
    hiredis 1.2.0
    nananqujava
        113
    nananqujava  
       124 天前
    winform 或者 WPF
    miaomiao888
        114
    miaomiao888  
       124 天前
    既然提到了易语言,不如试试炫语言?这早期是个界面库,之后又加了个 IDE ,应该能满足你对界面美观又体积小的要求,性能的话本身也是基于 C++,应该没啥区别。
    wjd2002
        115
    wjd2002  
       124 天前
    Delphi 可以,小、快,基本不需要其它 Dll ,有很多第三方美化 UI ,只有一个前提,得会 pascal 。
    leqoqo
        116
    leqoqo  
       124 天前
    windows 7 好像就自带.net framework 2 了, 或者考虑考虑早期的 飞信内置虚拟机
    s7964926
        117
    s7964926  
       124 天前
    我也一直在考虑 Windows 到底用什么去开发, 后来选择了 C++ 和 Qt ,原因无他,比较方便。
    界面啥的我也已经不做要求了……能跑就行,但是一堆文件在软件根目录看起来真的很恶心。
    楼主最后选择的是啥?我准备把我的小翻译器也重构下。
    feirisu
        118
    feirisu  
    OP
       124 天前
    @s7964926 c#加 avalonia 的 AOT 方案,具体实施文章有补充
    ikas
        119
    ikas  
       124 天前
    c++ 调用原生 winui3 ui 不行么,我的一个 app,秒启动,启动后内存 30M..打包那就更小了
    openmynet
        120
    openmynet  
       124 天前
    rust 的 iced ,优点:尺寸小、单文件、无依赖,UI 可以做到很漂亮,跨平台;缺点:得会 rust ,目前多窗口好像还没有。awesome-iced 下列举了一些在使用 iced 开源项目
    loginv2
        121
    loginv2  
       123 天前
    Lazarus
    pollux
        122
    pollux  
       119 天前
    python + tkinter ,要美化用 ttkbootstrap 或者 customtkinter ,8~10M 左右不香吗?
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3401 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 13:03 · PVG 21:03 · LAX 06:03 · JFK 09:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.