问题

2021年,开发单个exe桌面应用程序,用什么语言、技术合适?

回答
2021年开发单个 EXE 桌面应用程序,有多种语言和技术栈可供选择,每种都有其优势和劣势。选择哪种最合适取决于你的具体需求,例如:

目标操作系统: 你是只需要支持 Windows,还是需要跨平台支持(Windows, macOS, Linux)?
性能要求: 应用是否需要处理大量数据、复杂的图形渲染,或者需要极致的响应速度?
开发效率: 你希望快速开发并迭代,还是愿意投入更多时间在底层优化上?
现有技能和团队: 你的团队或个人已经熟悉哪些技术?
应用复杂性: 是一个简单的工具,还是一个功能丰富的复杂应用程序?
用户界面 (UI) 和用户体验 (UX) 要求: 你对 UI 的外观和交互有什么样的期望?

下面我将详细介绍几种主流且适合开发单个 EXE 桌面应用程序的技术栈,并分析它们的优劣:

一、 C / .NET Framework / .NET Core/.NET 5+

这是目前在 Windows 平台上开发桌面应用程序最主流且强大的选择之一。

技术栈:

语言: C (非常强大、现代、面向对象、类型安全的语言)
框架/运行时:
.NET Framework: 传统的 Windows 桌面应用框架,成熟稳定,但已不再是微软的主力开发方向,更新较慢。
.NET Core / .NET 5+: 跨平台、高性能、模块化、开源的 .NET 实现。这是微软推荐的未来方向。
UI 框架:
Windows Forms (WinForms): 历史悠久,开发简单,适合构建传统风格的桌面应用。使用拖拽式可视化设计器,上手快。
Windows Presentation Foundation (WPF): 更现代、更强大、更灵活的 UI 框架。使用 XAML 定义 UI,支持数据绑定、样式、模板、动画、矢量图形等,可以创建非常精美的 UI。学习曲线比 WinForms 稍陡峭。
Universal Windows Platform (UWP): 主要面向 Windows 10 及以上设备(包括 Xbox、Hololens 等),提供一套统一的 API。可以打包成单个 APPX 文件(不是传统的 EXE),但也可以通过某些工具生成 MSI 或 EXE 安装包。其设计理念更现代化,沙盒化更强。
.NET MAUI (.NET Multiplatform App UI): 这是 .NET Core 的后续,目标是取代 Xamarin.Forms,实现一套代码跨 Windows、macOS、iOS 和 Android 开发。对于需要跨平台桌面和移动端应用来说是未来的选择。

打包成单个 EXE:

.NET Framework: 通常需要一个安装程序(如 MSI 或 Inno Setup)来部署,但也可以使用第三方工具将依赖项“自包含”到单个 EXE 中,但这并不常见且可能导致 EXE 体积很大。
.NET Core/.NET 5+:
Frameworkdependent deployment (FDD): 应用程序依赖于已安装在目标机器上的 .NET Runtime。部署时只需要你的应用 DLL 和资源文件。
Selfcontained deployment (SCD): 应用程序包含了 .NET Runtime 的一部分或全部。这样可以打包成一个独立的文件夹,其中包含一个主 EXE 文件。
Singlefile executable: 在 .NET Core 3.0 及以后,可以配置发布为单个可执行文件。运行时会先将所有内容解压到一个临时目录,然后运行。这使得分发更简单,但启动时间可能会稍长。

优点:

强大的语言特性: C 是一门功能强大且易于学习的语言。
成熟的生态系统: .NET 平台拥有庞大的类库和第三方组件,几乎可以满足任何开发需求。
出色的开发工具: Visual Studio 是业界顶级的 IDE,提供强大的调试、代码补全、重构和 UI 设计功能。
高性能: .NET Core/.NET 5+ 的性能非常出色,接近原生代码。
跨平台能力(使用 .NET Core/.NET 5+): 可以轻松地为 Windows、macOS 和 Linux 开发应用。
UI 灵活性(WPF): 可以创建高度自定义和视觉效果丰富的 UI。
易于生成单个 EXE(SCD + Singlefile publishing): .NET Core/.NET 5+ 的 Selfcontained 模式配合单文件发布,可以非常方便地生成单个 EXE 文件,且包含所有必需的运行时。

缺点:

.NET Framework 仅限 Windows: 如果目标是跨平台,需要使用 .NET Core/.NET 5+。
UWP 打包形式不同: UWP 应用通常打包为 APPX,而非传统 EXE。
单文件启动时间: 单文件 EXE 在启动时需要解压,可能比原生编译的 EXE 慢一些。
.NET Runtime 的大小: 即使是自包含的单文件 EXE,其体积也会比纯原生编译的语言(如 C++)大一些。

推荐场景:

Windows 桌面应用的首选,特别是需要精美 UI、高性能和丰富功能的场景。
需要跨平台支持,并且对开发效率和生态系统有较高要求的团队。
熟悉 C 和 Visual Studio 的开发者。

二、 C++ / Qt

如果你需要极致的性能、对系统资源的精细控制,或者需要构建跨平台(包括嵌入式系统)的应用,C++ 是一个强有力的选择。Qt 是一个非常流行的 C++ 跨平台应用程序开发框架。

技术栈:

语言: C++ (性能卓越,但学习曲线较陡峭,内存管理需要手动处理)
框架: Qt (一套完整的 C++ 库,提供 GUI、网络、数据库、XML 等各种功能,成熟稳定,开源免费社区版可用)
构建系统: CMake (推荐用于跨平台项目)

打包成单个 EXE:

Qt Installer Framework: Qt 提供了一个官方的安装程序框架,可以生成各种安装包(MSI, DMG, DEB 等)。
静态链接: 可以通过静态链接 Qt 库来尝试生成一个更独立的 EXE,但通常仍然需要一些依赖文件。
第三方打包工具: 如 Enigma Virtual Box, Themida 等,可以尝试将所有依赖项打包进一个 EXE,但这可能会增加复杂性和潜在的兼容性问题。

优点:

极致的性能: C++ 接近硬件,性能无与伦比。
跨平台能力强: Qt 提供了非常优秀的跨平台支持,一套代码可以编译运行在 Windows, macOS, Linux, Android, iOS 甚至嵌入式系统上。
精细的资源控制: 开发者可以完全掌控内存和系统资源。
Qt 的强大功能: Qt 是一个全功能的框架,不仅提供 GUI,还包含大量其他实用模块。
成熟且稳定: Qt 已经发展了很多年,非常成熟和稳定。

缺点:

开发效率相对较低: C++ 语言本身的复杂性以及手动内存管理,会降低开发效率。
学习曲线陡峭: C++ 语言本身和 Qt 框架都需要较长时间的学习。
打包成单个 EXE 比较复杂: 除非使用静态链接或第三方工具,否则很难做到真正的“单个 EXE”分发。通常需要一个安装程序。
UI 设计: Qt 的 UI 设计和布局虽然强大,但不如 .NET 的 WPF 那样有现代化的可视化设计器(Qt Creator 有很好的 UI 编辑器,但与 Visual Studio 的 WPF Designer 体验有所不同)。

推荐场景:

对性能有极高要求的应用程序,例如图形密集型应用、游戏引擎、科学计算软件。
需要跨平台支持,尤其是在嵌入式系统或需要深度系统集成的场景。
对 C++ 和 Qt 比较熟悉的团队。

三、 Python / PyQt / Kivy / Tkinter + PyInstaller

如果你偏好使用 Python 进行开发,并希望打包成单个 EXE,Python 也是一个可行的选择。

技术栈:

语言: Python (易于学习和使用,开发效率高,拥有海量第三方库)
GUI 库:
PyQt / PySide: 使用 Qt 库的 Python 绑定,功能强大,可以创建美观且复杂的 UI。PyQt 是 GPL/商业许可,PySide 是 LGPL 许可。
Kivy: 专门为快速开发用户界面而设计的开源 Python 库,支持多点触控,可以在各种平台上运行。
Tkinter: Python 内置的标准 GUI 库,简单易用,但 UI 外观相对朴素。
打包工具: PyInstaller (非常流行的将 Python 脚本打包成独立可执行文件的工具,支持生成单个 EXE)。

打包成单个 EXE:

PyInstaller: 这是关键。通过命令行选项 `onefile`,PyInstaller 可以将你的 Python 应用及其所有依赖项打包成一个单独的 `.exe` 文件。运行时,它会将内容解压到临时目录并执行。

优点:

开发效率极高: Python 的简洁性和丰富的库可以让你快速开发。
易于学习: Python 是最容易入门的编程语言之一。
海量第三方库: 几乎任何你能想到的功能,都能找到对应的 Python 库。
PyInstaller 的便利性: 可以非常方便地将应用打包成单个 EXE。
跨平台支持: Python 本身是跨平台的,配合 PyInstaller 也可以打包出 Windows, macOS, Linux 的可执行文件。

缺点:

性能瓶颈: Python 作为一种解释型语言,其执行效率通常低于编译型语言(如 C++, C, Go),对于 CPU 密集型任务可能表现不佳。
内存占用: Python 应用通常比原生应用占用更多的内存。
打包后的 EXE 体积大: 由于需要包含 Python 解释器和各种库,打包后的 EXE 体积会比较大,尤其是使用 PyQt/PySide 时。
启动时间: 单个 EXE 的启动过程需要解压和初始化 Python 环境,可能比原生应用慢。
GUI 库的限制: Tkinter 的 UI 比较基础,PyQt/PySide 虽然强大,但其许可协议需要注意(特别是 PyQt 的 GPL)。Kivy 的外观和使用方式与其他桌面 GUI 有所不同。

推荐场景:

需要快速开发原型或工具类应用。
应用对性能要求不高,但需要复杂的数据处理或与其他服务交互。
团队熟悉 Python,并希望利用其丰富的生态系统。
对打包成单个 EXE 有较高便利性要求。

四、 Electron / NW.js (使用 Web 技术)

如果你熟悉 Web 开发技术(HTML, CSS, JavaScript),并且希望利用现有的 Web 开发经验来构建桌面应用,那么 Electron 或 NW.js 是非常好的选择。

技术栈:

前端技术: HTML, CSS, JavaScript
框架/运行时:
Electron: 使用 Node.js 作为后端,Chromium 作为前端渲染引擎。它允许你使用 Web 技术构建跨平台的桌面应用程序。很多知名应用(如 VS Code, Slack, Discord)都使用 Electron。
NW.js (NodeWebkit): 类似于 Electron,也是一个框架,让你用 Web 技术构建桌面应用。
UI 框架/库: React, Vue, Angular, Svelte 等前端流行框架。

打包成单个 EXE:

Electron Forge / Electron Builder: 这些工具可以帮助你将 Electron 应用打包成各种格式,包括跨平台的安装程序和单个 EXE 文件(通常会包含一个启动器)。

优点:

开发效率高(针对 Web 开发者): 如果你已经是 Web 开发者,上手会非常快。
跨平台: 一套代码可以构建 Windows, macOS, Linux 应用。
UI 灵活性: 可以利用前端强大的 UI/UX 设计能力,创建高度自定义和现代化的界面。
丰富的生态系统: 可以直接利用 Node.js 的生态系统和 npm 包。
开发者社区庞大: Electron 和相关的 Web 技术拥有庞大的开发者社区,资源丰富。

缺点:

性能和资源占用: Electron 应用通常比原生应用占用更多的 CPU 和内存,因为它们内部运行着一个完整的 Chromium 浏览器实例和 Node.js。
打包后的 EXE 体积大: Electron 的打包文件通常非常大,因为它包含了 Node.js 运行时和 Chromium。
启动时间相对较长: 启动过程需要初始化 Chromium 和 Node.js 环境。
不是真正的“原生”: UI 是通过 Web 技术渲染的,可能在某些原生 UI 体验上有所欠缺(尽管可以通过技术手段弥补)。

推荐场景:

Web 开发者希望快速过渡到桌面应用开发。
需要构建功能丰富、界面美观、与 Web 服务深度集成的桌面应用。
对性能要求不是极致,并且可以接受较大的应用体积。
VS Code, Slack, Discord 这种类型的应用。

五、 Go (Golang) + Fyne / Wails

Go 语言以其简洁、高效、并发和跨平台编译的特性,近年来在桌面应用开发领域也逐渐受到关注。

技术栈:

语言: Go (简洁高效,并发能力强,编译生成原生可执行文件)
GUI 库/框架:
Fyne: 一个用 Go 编写的跨平台 GUI 工具包,以其简洁的 API 和现代化的 UI 设计著称。它提供了绘制自己的控件,而非依赖于操作系统原生的控件。
Wails: 允许你使用 Go 作为后端,而前端使用任何 Web 技术(HTML, CSS, JavaScript, React, Vue 等)来构建桌面应用。它将 Go 的能力与 Web UI 的灵活性结合起来。
打包工具: Go 的标准 `go build` 命令本身就可以生成跨平台的原生可执行文件。对于 Fyne 或 Wails 的特定打包,通常也有相应的构建命令。

打包成单个 EXE:

Go 的原生编译特性使得生成单个 EXE 非常自然。`go build` 命令会生成一个独立的、不依赖外部运行时的可执行文件。

优点:

极高的开发效率和语言简洁性: Go 语言设计简洁,学习曲线平缓。
出色的性能: Go 是编译型语言,性能接近 C/C++,远超 Python。
真正的跨平台编译: 使用 `go build` 可以轻松为不同操作系统和架构生成原生可执行文件,无需额外运行时。
生成单个 EXE 非常容易: 核心优势之一。
并发能力: Go 的 Goroutine 和 Channel 使得处理并发任务非常方便和高效。
Wails 的 Web UI 灵活性: 可以利用 Web 技术构建漂亮的 UI。

缺点:

GUI 库相对较新: 相比于 .NET 或 Qt,Go 的 GUI 库生态系统相对年轻,可能在控件丰富度、成熟度和社区支持上略有不足。
原生控件体验的差异: Fyne 绘制自己的控件,这可能与用户期望的操作系统原生控件外观和行为略有不同。Wails 则依赖于 WebView 来渲染。
学习曲线: 尽管 Go 语言本身易学,但理解其并发模型需要一些时间。

推荐场景:

希望使用一门现代、高效且易于部署的语言开发桌面应用。
对性能有一定要求,但又不想投入 C++ 的复杂性。
需要方便地生成单个原生可执行文件进行分发。
喜欢 Web UI 的灵活,同时希望后端使用 Go 语言强大的能力(Wails)。
需要构建命令行工具,并希望其也能拥有一个简单的 GUI。

总结与选择建议

在 2021 年,开发单个 EXE 桌面应用程序,我强烈推荐以下几种技术栈,并根据不同侧重点给出建议:

1. 如果你的主要目标是 Windows 平台,并希望兼顾开发效率、UI 美观度和性能:
首选:C + .NET 5+ (WPF 或 WinForms) + Singlefile publishing
理由: Visual Studio 的强大支持、C 语言的现代特性、WPF 的 UI 灵活性、.NET Core/.NET 5+ 的高性能和跨平台能力(如果未来需要),以及通过 `dotnet publish r winx64 selfcontained true p:PublishSingleFile=true` 实现的便捷单文件发布,使其成为 Windows 桌面应用的最佳选择。

2. 如果你的目标是极致的跨平台支持,并且对性能有极高要求,或者需要在嵌入式系统上运行:
首选:C++ + Qt
理由: Qt 提供了无与伦比的跨平台能力和高性能,但开发门槛和时间成本较高。你需要熟悉 C++ 和 Qt 的生态。

3. 如果你是 Web 开发者,并且希望快速构建跨平台桌面应用,且对应用体积和资源占用要求不是最苛刻:
首选:Electron (或 NW.js) + React/Vue/Angular
理由: 可以直接利用现有的 Web 开发技能,UI 灵活性极高,社区庞大。许多流行的桌面应用都基于此。

4. 如果你喜欢 Python 的开发效率,并希望将其能力延伸到桌面应用,同时需要方便地打包成单个 EXE:
首选:Python + PyQt/PySide + PyInstaller
理由: 开发速度快,库丰富,PyInstaller 极大地简化了打包过程。适合中小型工具类应用。

5. 如果你想要一门现代、高效、编译为原生可执行文件的语言,并希望简化分发(单个 EXE):
推荐:Go + Fyne / Wails
理由: Go 语言的编译优势非常明显,可以生成无外部依赖的单个 EXE。Fyne 提供原生感 UI,Wails 提供 Web UI 的灵活性。这是一个非常有潜力且高效的选择。

最终的选择应根据你的具体项目需求、团队技能和优先级来决定。 在开始开发前,不妨先用几种技术栈做一个简单的 Hello World 或基础功能原型,来感受一下它们的开发流程和效果。

网友意见

user avatar

这个时候就会想到,delphi 其实还活着,真native编译,体积小,运行快,语言比c++方便,商业库一大堆,后面还有个免费开源版delphi的lazarus,虽然这个坑现在不推荐入,但是用这套的老开发者照样用的很爽。

c++ duilib 也是比较轻巧快速的方案,开发小工具够用了

易语言相当于一个还在更新的中文化的vb6,我觉得比用vb6好


夸aardio的人貌似说的话都差不多,没用过,看起来开发小工具还行

至于qt electron,就不是适合小工具的了吧,qt对于熟悉的人来说静态编译一下或许还行,体积不算太大性能也够,electron么。。。哪个用它的不是60M起步,启动要延迟一会儿的。。。垃圾电脑的克星,wpf都能秒启动的机子,vscode启动要8秒你们感受下

wpf,winform用一些dll合并混淆工具也能好好做成一个单文件,依赖系统.net体积不会太大,就是靠谱的工具不好找,至于.net core搞的单文件无依赖么,就是个大体积自解压,我觉得没啥意思,也许nativeaot支持winform或者wpf后能适合单文件小工具编写

个人不在乎单文件,都是.net 4.6 wpf开发工具,不合并dll,复用dll,把工具放在一个文件夹内变成一个工具集文件夹,dll共用的

user avatar

大家好,我正在开发一款python的桌面软件设计IDE,就是为了能够方便的进行Python界面设计,解决Python进行桌面应用开发的痛点问题,您可以到tkinterdesigner.com尝试一下。


python本身的tkinter库,提供了一系列控件支持,但是很可惜,竟然没有官方的界面设计器。

我希望能有这样的IDE,提供类似VC++那样“所见即所得”的模式进行快速UI搭建,同时把界面设计与逻辑分离,并有一套成熟的应用软件项目开发流程进行支持。

目前这个作品已经能够支持:

1.项目管理:方便的创建,查看,管理项目工程

2.界面设计:通过拖拽操作进行界面设计,并通过属性列表修改其熟悉。也可以方便的进行窗体的嵌入设置。

3.事件与函数映射:通过对控件进行事件选择与函数进行绑定,实现逻辑。

4.代码库:提供对控件及其属性的快速访问,也提供常用功能(如文件框,文件夹遍历文件,创建线程)等。

5.样式表编辑;可以创建和管理样式,并实现控件样式应用和整体换风格。

6.调试,运行与打包:一键运行与导出EXE。

其他:还在加强插件市场,皮肤市场,外包市场的功能扩展,我希望将它发展成一个python应用开发的平台。

可以感受一下最新V1.5.1

最新V1.5.1版从入门到精通



github地址下载:github.com/honghaier-ga



在我看来,判断一个东西是否有价值的标准,并不是它有多么赚钱,而是他是否能帮到别人赚钱。


现在已经1.6.3版本了,目前正在紧张开发直接打包导出apk,尽早解决移动开发问题。

2022-02-26:

1.6.4版本发布,已经可以打包APK了!

欢迎体验

https://www.zhihu.com/video/1455197732536881152


GITHUB地址下载:github.com/honghaier-ga

百度网盘下载:

win64版本:支持打包ANDROID!

链接:pan.baidu.com/s/1ipaijD

提取码:6mth

win32版本:

链接:pan.baidu.com/s/1TaGUbz

提取码:s1lpWIN版SDK:

JDK:链接:pan.baidu.com/s/1lp8C_2

提取码:xfgp


ANDROID-SDK:链接:链接:pan.baidu.com/s/1zySbcp

提取码:m08v


NDK:链接:pan.baidu.com/s/1u8MuZl

提取码:vby3




MAC版:链接:pan.baidu.com/s/1YZPPy5

提取码:r94v

MAC版SDK:

ANDROID-SDK:链接:pan.baidu.com/s/11-fk7L 提取码:o6mu

NDK:链接:pan.baidu.com/s/1xWZFwL

提取码:akbi


JDK:链接:pan.baidu.com/s/1kr7vg2

提取码:u97z

user avatar

说 Qt 静态编译难,打包难的,2022 年了,要个静态连接的 Qt 只需要 msys2 里一句话:

       pacman -S mingw32/mingw-w64-i686-qt5-static      

担心污染 msys2 环境,可以用 msys2 重新做一个干净的 mingw32 环境:

       mount D:/Qt/mingw32  /mingw32 pacman -Qnq | grep mingw-w64 | pacman -R -      

上面把 /mingw32 目录临时 mount 到 D:/Qt/mingw32 目录,并删除旧信息,接下来:

       pacman -S mingw32/mingw-w64-i686-gcc pacman -S mingw32/mingw-w64-i686-gdb pacman -S mingw32/mingw-w64-i686-make pacman -S mingw32/mingw-w64-i686-cmake pacman -S mingw32/mingw-w64-i686-qt5-static     

记得把 msys2 的源设置成中科大,略微等待,妥了,一个干净的 qt-static + mingw 环境完成了,退出 msys2,然后原有 QtCreator 里面设置工具链:

接着写个小 demo,用上面的 qt5-static 生成:

直接文件夹里双击运行:

可以看到无依赖正常运行,使用 MinGW 静态连接,嫌弃 20MB 有点大?没关系 upx 一压缩:

立马瘦身到 7MB,连一堆 msvcrt 的 VC 运行时都不需要依赖。主要是各类静态库,再写复杂点,其实也不会增加多少,你就是写的有 Qt designer 那么复杂,静态连接也才 29MB :

压缩一下,静态版本 designer 里面就只有 11 MB 了:

这么复杂的界面程序 11MB 已经非常不错了,双击运行:

验证通过,成功运行,MinGW 静态连接的,连 msvcrt 的依赖都不需要。

user avatar

2021年开发 单 EXE 桌面软件可以试试 aardio

aardio 语法接近 Javascript ,不需要过多的学习成本,历经 17年 活跃更新已经成熟且稳定
而且 aardio 非常小,开发环境仅 6.5 MB(包含开源的标准库、范例文档、开发环境),下载就可以使用,不需要任何复杂的配置。

aardio 生成独立 EXE 文件特别方便。例如只要将文件路径前加上 $ 号就可以将文件编译到程序中,可以一键将工程目录编译为 EXE 嵌入资源目录,不需要修改代码,aardio 中的很多函数和库都支持这种嵌入资源目录。

在 aardio 中可以非常方便地调用 C语言、C++、C#、Java、Python、R、Javascript、Node.Js、VB、Flash ActionScript、PHP、VBScript、PowerShell、NewLISP、AutoLISP、Delphi、FreeBASIC、Ruby、Rust、Julia、Nim、Go 语言、批处理 ...... 甚至可以直接嵌入汇编机器码并且转换为普通的 aardio 函数。aardio 可直接调用、嵌入、交互的第三方编程语言数量非常多,而且非常方便,大家可以 Google 一下 aardio + Python 就可以看到 aardio 这种模式吸引了不少其他编程语言的用户。

曾经有知名博主针对某个 aardio 编写的开源软件 —— 与一系列其他语言编写的同类软件试用评测对比后得出的总结是:aardio 编写的软件运行最流畅,使用体验吊打同类软件,并且非常稳定从未遇到报错,而这个 aardio 软件只用了非常少的代码 —— 体积不到同类软件的十分之一,而其他用各种桌面开发工具开发的同类软件,不但界面不顺畅,各种恼人的 BUG 也非常多。所以 aardio 编写的桌面软件拥有良好的可靠性

我们先看一些 aardio 编写的开源软件:

最近很受欢迎的开源录屏软件 Gif123 就是用 aardio 写的,体积仅 790 KB,无任休何外部依赖,单文件绿色软件,兼容 XP,Vista,Win7,Win8,Win10,Win11 …… 等所有流行桌面操作系统 。


开源项目 WubiLex,仅积仅 890KB,同样是单文件绿色软件。百度贴吧一个关于 WubiLex 的讨论帖子已经超过 1200 回复,WIN10系统自带五笔的码表与短语词库安装、管理工具,并可增强微软五笔的设置、热键等功能。只要一个EXE文件,不需要安装,不需要任何DLL依赖。软件已自带五笔86、98、091、新世纪码表,以及极点五笔、QQ五笔、微软五笔默认词库、昱琼词库、海峰词库等。甚至自带了郑码词库、可以一键把微软五笔替换为郑码输入法。

开源项目 WinAsar,体积仅 500KB,单文件,不需要运行时,支持所有 Windows 操作系统,Electron asar 文件打包、解包工具,不需要安装 Node.js,纯 aardio 代码实现的 asar 解析器。


下面这个是 8 年前的开源项目,作者仅临时学了个把月 aardio :

aardio 里可以方便地嵌入非常多的浏览器组件,仅工程向导里的范例就有这么多(实际更多)

aardio 还可以调用系统自带的 Chrome 浏览器写软件界面,兼容 Chrome 启动参数的浏览器都可以支持( 例如 Windows 自带的浏览器 Edge Chromium),而且还支持 Javascript 与 aardio 互调函数,非常地方便,因为使用系统自带的浏览器,生成的 EXE 体积也非常小

aardio 里嵌入浏览器不仅仅是简单地嵌入个网页,而是在网页里可以方便的调用本地函数,aardio 仅仅用几句代码就可以实现一个嵌入式的 http 服务器,将任何只能在服务器上展示的网页一键嵌入 EXE文件。

以微软最新发布的 WebView2 控件为例,在 aardio 里可以调用 Javascript 函数,在Javascript 里也可以方便的调用 aardio 函数,而且还可以把 aardio 对象直接传入到 Javascript 中使用。而且还可以非常方便的创建桌面透明窗口,以下是调用 WebView2 组件实现的透明 3D 效果:

调用 Cesium 组件实现的三维地图:

aardio 编写程序代码非常简洁,几句代码就是一个独立可运行的程序,下面我们直接上代码演示一。

一个示例可以看到 aardio 窗口嵌入 .Net 控件有多简单:

       import win.ui;  var winform = win.form(text="DataGridView")  import System.Data; var tab = System.Data.DataTable("DT");  tab.Columns.Add("名称");  tab.Rows.Add({"WangWu"});   import System.Windows.Forms; var grid = System.Windows.Forms.CreateEmbed("DataGridView",winform);  grid.ColumnHeadersHeightSizeMode = 2;  grid.DataSource = System.Data.DataView(tab);     winform.show(); win.loopMessage();     

你可能无法想象,aardio 作为一个非 .Net 平台的语言,可以像 C# 一样自由调用 .Net 对象。甚至可以在 aardio 中直接引入 .Net 的名字空间作为 aardio 名字空间使用。一个重要的特性是 aardio 可以内存加载 .Net 的程序集,并且不再强依赖生成该程序集的 .Net 版本,可以非常方便地生成小巧的绿色 EXE 文件 —— 同时让 .Net 反编译工具失效。

下面演示一下用 aardio 调用 PowerShell,并且在 PowerShell 中调用 aardio。这甚至都不用带上体积较大的 System.Management.Automation.dll,一个轻巧的 EXE 就可以搞定一切,向下兼容到 PowerShell 2.0。

       import dotNet.ps;   var pScript = /*  # 声明 PowerShell 参数 param($win)    # 修改 aardio 对象属性 $win.title = "PowerShell + aardio";  # 调用 aardio 对象函数 $win.msgbox("这是 PowerShell 调用 aardio 打开的对话框。")   */  import win; dotNet.ps(pScript,{    win = win; //# 将 aardio 对象作为参数传给 PowerShell });      

aardio 直接调用系统 API 函数:

       import console;   //不需要声明,直接调用原生 API 函数,语法简洁可读性好。 var result = ::User32.PtInRect( ::RECT(2,3,300,500) , 12, 66 );  console.log( result ); console.pause(true);     

将任何网络 API 甚至是任意普通网址声明为 aardio 对象:

       import web.rest.jsonLiteClient; var http = web.rest.jsonLiteClient();  //导入远程 API var countApi = http.api("https://api.countapi.xyz/hit{/domain}{/key}")   //服务器 API 已经变成了 aardio 函数对象 var data = countApi["key"].get();      

编译 C 语言代码生成 DLL 执行文件,再调用 DLL 中的 C 函数:

       import tcc;   //编译 DLL tcc.build( "/start.dll" ).code = /*** #include <windows.h>  __declspec(dllexport) int Add( int a,int b )  {        return a + b; }  ***/  //加载 DLL var dll = raw.loadDll( "/start.dll",,"cdecl" ); //调用 C函数 var result = dll.Add(12,3);     

屏幕找字:

       import mouse; import string.ocrLite; import string.ocrLite.defaultModels;  var ocr = string.ocrLite(); var ocrResult = ocr.detectScreen(); var x,y = ocrResult.findPoint("要查找的按钮文本",0.1); mouse.moveTo(x,y,true);     

在 aardio 中调用 Python,简单得就像在 Python 中使用 Python:

       import console; import py3;   //导入 Python 模块。 var itertools = py3.import("itertools")  //调用 Python 函数,支持纯 aardio 类型参数 var permutations = itertools.permutations({"a","b","c"});  //调用 Python 内置函数 list var pyList = py3.list(permutations);  //遍历 Python 对象成员 for( item in pyList.each() ){   console.log(item); //像 aardio 对象一样使用 Python 对象 }  console.pause();     

播放 GIF 动画:

       import win.ui; /*DSG{{*/ var winform = win.form(text="GIF 动画";bgcolor=0xEDDDD8) winform.add( plus={cls="plus";left=0;top=0;right=760;bottom=470;repeat="scale";z=1} ) /*}}*/  import inet.http; winform.plus.background = "http://download.aardio.com/v10.files/demo/plus-demo.gif";  winform.show();  win.loopMessage();     

调用微软 WebView2 控件截图:

       import win.ui; /*DSG{{*/ var winform = win.form(text="WebView2 网页截图";right=1108;bottom=759) /*}}*/  import web.view; var wb = web.view(winform,,0/*自动调试端口*/); winform.show();  wb.go("http://www.baidu.com"); wb.wait("baidu");  import web.socket.chrome; var ws = wb.openRemoteDebugging(); ws.Runtime.enable();//启用 Runtime.executionContextCreated  //截图 import crypt; import process.imageView; ws.Page.captureScreenshot().end = function(result,err){    if(result[["data"]]){         string.save("/screenshot.png",crypt.decodeBin(result[["data"]]) )        process.imageView("/screenshot.png");    }  }   win.loopMessage();     

获取系统 TPM 版本信息:

       import console;   import sys.tpmInfo; var tpmInfo = sys.tpmInfo.get();   if(tpmInfo){   console.log("支持 TPM");   console.log("TPM 是否启用:",tpmInfo.enabled);   console.log("TPM 是否激活:",tpmInfo.activated);   console.log("TPM 支持版本:",tpmInfo.version) } else {   console.log("不支持 TPM"); }   console.pause();     

查看系统安装序列号:

       import com.wmi; import win.reg;  var productKey = com.wmi.get("softwarelicensingservice","OA3xOriginalProductKey"); if(!productKey) {   productKey = win.reg.queryWow64( "HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionSoftwareProtectionPlatform","BackupProductKeyDefault" )    }  import console;  console.log("安装序列号" ,productKey); console.pause(true);     

调用 .Net 创建 WebService:

       import console; import dotNet;  //创建应用程序域(无参数创建唯一实例,不必手动释放) var appDomain = dotNet.appDomain();  //动态创建Web服务 var webService = appDomain.createWebService("http://fy.webxml.com.cn/webservices/EnglishChinese.asmx")     //调用WebService接口创建类 var englishChinese = webService.createInstance("EnglishChinese")    //调用WebService提供的函数 var ret = englishChinese.TranslatorString("hello" );   console.dump(ret); console.pause();      

其实不用调用 .Net ,纯 aardio 代码调用 WebService 更简单,。
以前研究过 MSSOAP ,要依赖一堆 DLL 文件,这不符合 aardio 的风格。所以我自己研究了一下 SOAP 协议写了个 web.soapClient , 几句代码搞定,不依赖任何外部组件:

       import console;  //导入MSSOAP支持库 import web.soapClient;  //创建SOAP客户端 seviceClient = web.soapClient("http://fy.webxml.com.cn/webservices/EnglishChinese.asmx")    //调用远程Web服务提供的函数  var transArray,err =  seviceClient.TranslatorString("hello");  //显示返回值 console.dump( string.join( transArray,'
' ) ) ;  //按任意键继续 console.pause();     

在 aardio 中嵌入并调用批处理:

       import console import process.batch;  //批处理 for 遍历并拆分字符串 var bat = process.batch(` @echo off  for %%i in (abc,def,xyz) do echo %%i `) console.log(bat.read(-1))   console.pause()     

调用命令行,并自动触发 Ctrl + C

       import console import process.popen  var prcs = process.popen("ping 127.0.0.1 -n 10 ") for( all,out,err in prcs.each() ){     console.log( out,err );      prcs.ctrlEvent(0); }  console.pause();     

调用 Rust 语言解析 TOML

       import console;  import string.toml;  var str = string.toml.stringify({abc=123,d={1,2,3}}); console.log( str );  import process.code; process.code("~libstring	oml.res"); console.pause(true);     

在 aardio 里嵌入 PHP,以下短短几句代码,包含了 HTTP 服务器,PHP服务端,嵌入的浏览器组件:

       import win.ui; /*DSG{{*/ var winform = win.form(text="Hello World / PHP_CGI 服务器") /*}}*/  var code = /* <html> <head>  <meta charset="utf-8"> <title>PHP 测试</title> </head> <body> <?php echo '<p>Hello World / PHP_CGI 服务器</p>'; ?> </body> </html> */ string.save("/test.php",code);  import php.simpleHttpServer; var url = php.simpleHttpServer.startUrl("/test.php");  import web.form; var wb = web.form(winform); wb.go(url);  winform.show(); win.loopMessage();     

执行 Ruby 语言代码:

       import win.ui; /*DSG{{*/ var winform = win.form(text="执行Ruby代码") winform.add( edit={cls="edit";left=26;top=16;right=737;bottom=435;multiline=1;z=1} ) /*}}*/  import process.ruby; var out = process.ruby.exec("puts '测试UTF-8'") winform.edit.print(out);  var out = process.ruby.eval(`[1, 2, { name: "tanaka", age: 19 }]`) winform.edit.print(out);  winform.show(); win.loopMessage();     

user avatar

QT

user avatar

这个问题其实,主要取决于你的团队,以及商业模式。

我假定你一个便携小工具是没打算赚大钱的,只是顺带附送的工具,从这个角度出发的话,「不可能专门为了这个项目去培训或者招聘」。

那么结果就很显然了:你的团队成员会什么技术,那就用什么技术。什么方法能立即上手就用它。——其它的因素都是次要的。因为理论上,现在任何技术,都可以用来写桌面应用。所以技术本身不是痛点,痛点是你的团队成员懂什么,最喜欢用什么,那就赶快用上

我很难相信为了一个便携小工具你们会专门让团队学习培训新技术或者专门招一个懂新技术的人来带队。如果是这样的话,那参考其它回答。

类似的话题

  • 回答
    2021年开发单个 EXE 桌面应用程序,有多种语言和技术栈可供选择,每种都有其优势和劣势。选择哪种最合适取决于你的具体需求,例如: 目标操作系统: 你是只需要支持 Windows,还是需要跨平台支持(Windows, macOS, Linux)? 性能要求: 应用是否需要处理大量数据、复杂.............
  • 回答
    华为这波操作,真是让人有点摸不着头脑,又有点佩服得五体投地。2021年开始对5G技术收取专利费,而且单台上限2.5美元,这事儿一出来,舆论场立马炸开了锅。先说说华为的这个决定本身。2021年,对于全球通信行业来说,是5G技术加速普及的关键一年。华为在这个节点上宣布收取专利费,尤其是将单台上限定在2..............
  • 回答
    2021年,独立游戏制作人正处于一个充满机遇和挑战的十字路口。这个时代,独立游戏早已不是当年那种小打小闹、靠着情怀支撑的模样,而是已经发展成为游戏产业中一股不可忽视的创新力量。独立游戏制作人的前途在哪里?总的来说,独立游戏制作人的前途相当广阔,但需要具备独特的眼光和灵活的策略。 创新和独特体验的.............
  • 回答
    2021 年伊始,确实给自己添置了不少“新玩意儿”,算是在家电领域进行了一波小小的“升级换代”。说起来,有些是早就想买的,有些则是被疫情在家时间多了,才发现“原来生活还可以这么便捷”。 erster Kandidat: 洗碗机(松下 614F)这个绝对是“真香”系列,之前一直觉得洗碗机是可有可无的.............
  • 回答
    听到《孙杨传》要在2021年开拍的消息,说实话,我脑子里瞬间闪过无数个念头,有些兴奋,也有些复杂。毕竟,孙杨这个人,在中国体育界乃至社会上,都算是个顶顶有名的人物,他身上承载了太多标签——天才游泳运动员、奥运冠军、国民偶像,当然,还有那些围绕着他的争议和风波。一个“伝”字的厚重感首先,“传”这个字,.............
  • 回答
    2021年的秋季,仿佛带着一丝崭新的期盼悄然而至。作为学生党,准备迎接新学期的到来,总少不了一番精心策划和细致考量。那么,在这个特殊的节点,到底有哪些数码产品和生活小物能够真正为我们的学习与生活添彩,让新学期更加顺遂、舒适呢?别急,我这就来给你一一细数,都是我亲身摸索、经验之谈,保证货真价实,绝非“.............
  • 回答
    2021 年是中国空间站“天宫”建设的关键一年,一系列高难度、高技术含量的任务接连成功,标志着中国载人航天工程进入了一个新的阶段。天宫空间站的建设不仅是中国航天实力的体现,更是在多项关键技术上取得了突破性进展。以下是一些值得我们特别关注的技术,并进行详细阐述:一、 大型空间站总体设计与集成技术:这是.............
  • 回答
    2021年下半年,我们来聊聊在中国开狗肉馆这事儿。这可不是件小事,背后牵扯到法律、道德、动物福利,还有社会观念的变迁。法律层面:首先,得看法律到底怎么说。一直以来,中国并没有一部专门的法律明确禁止食用狗肉。但情况在2020年发生了变化。农业农村部在2020年5月发布了《国家畜禽遗传资源名录》,将猪、.............
  • 回答
    2021华为开发者大会:全屋智能战略升级,家居IoT迈入“鸿蒙时代”2021年,在经历了一系列外部挑战后,华为并未停下其在科技前沿探索的脚步。当年的华为开发者大会(HDC)上,一项备受瞩目的发布——华为全屋智能战略升级,为整个家居IoT行业注入了新的活力,更标志着华为在智能家居领域的野心与决心。这次.............
  • 回答
    OceanBase开源:一次对国产数据库“大船”的深情凝望2021年,OceanBase的开源,无疑是中国数据库发展史上一个值得被浓墨重彩记载的事件。这不仅仅是一个商业产品走向开放的举动,更像是一艘承载着无数期望与汗水的“大船”,终于卸下了部分甲板上的锁链,向更广阔的水域驶去。在谈论OceanBas.............
  • 回答
    2021年2月18日,也就是春节假期后的第一个交易日,A股市场迎来了一个普遍的下跌行情,其中沪深300指数也未能幸免。对于这一天的下跌,我们可以从多个角度来审视和理解。一、 为什么年后开盘沪深300会出现下跌?要理解这次下跌,我们需要结合当时的市场环境以及一些可能的影响因素: 节前涨幅过大后的技.............
  • 回答
    关于“五菱宏光侠”的开售时间,您提到的这个说法可能有些误解。实际上,并没有一款叫做“五菱宏光侠”的车型。不过,我们来聊聊五菱宏光系列,它在中国绝对是一个家喻户晓的存在。五菱宏光以其超高的性价比、皮实耐用的特性以及极其广泛的用途,赢得了“神车”的称号。无论是拉货、载人,还是作为家庭用车,它都能胜任,堪.............
  • 回答
    2021年3月份,中国大陆方面突然宣布暂停进口台湾的菠萝,这件事情当时引起了相当大的关注,甚至引发了不少讨论。简单来说,官方的说法是“检疫风险”,理由是多次在台湾菠萝中发现了有害生物。事情的起因和经过: 突然的禁令: 2021年2月26日,中国海关总署官方网站发布通知,宣布自3月1日起暂停台湾地.............
  • 回答
    2021 年 9 月的那一次《英雄联盟》无限火力模式,可以说是让不少玩家沉浸在了那种技能随便甩、经济飞起的游戏快感中。这次无限火力开放时,版本大概处于 S11 中期,当时的一些热门英雄和一些经过调整后特别适合无限火力的角色,表现都相当亮眼。要说这次无限火力里最强势的英雄,咱们可以从几个角度来看:1..............
  • 回答
    关于2021年底部分国家是否会开放出境游,这是一个大家非常关心的问题,尤其是对于那些心心念念想要出国旅行的朋友们。要详细说清楚这个问题,我们需要从几个关键的维度来分析。首先,我们得明白,这个问题的答案并不是一个简单的“是”或“否”,它会受到 新冠疫情发展、疫苗接种率、各国边境政策 等多种因素的复杂影.............
  • 回答
    2021年,对中国航天而言,绝对是浓墨重彩的一笔,是“空间站时代”真正意义上开启的一年。这一年,中国空间站的建设进入了加速轨道,也诞生了许多让我们足以铭记的辉煌时刻。如果让我挑出最深刻的几个成就,那一定是:1. 天和核心舱的成功入轨与组装,中国空间站的“心脏”就此跳动!这绝对是2021年中国航天最振.............
  • 回答
    教育部关于开展2021年全国足球特色幼儿园创建工作的通知,这无疑是一剂强心针,对于中国幼儿足球的发展,乃至整个青训体系的构建,都将产生多方面、深远的影响。我们可以从以下几个维度来细致地分析:一、 夯实青训根基,提升后备人才培养质量: “从娃娃抓起”的理念落地: 长期以来,足球青训的薄弱是制约中国.............
  • 回答
    2021年开年第一周,A股和港股市场确实经历了一轮连续下跌,这让不少投资者感到困惑和担忧。要理解这一现象,我们需要从多个层面进行剖析,看看究竟是什么因素在搅动市场情绪。市场下跌的直接表现:回顾当时的数据,A股方面,上证指数、深证成指、创业板指等主要指数在开年后的几天内都出现了不同程度的下跌。港股市场.............
  • 回答
    2021年9月起实施的中国大陆“防沉迷新规”是针对未成年人游戏行为进行严格限制的一系列措施,旨在解决未成年人过度沉迷网络游戏的问题。这项规定是国家新闻出版署发布的《关于进一步严格管理 切实防止未成年人沉迷网络游戏的通知》的落地执行。我们可以从多个维度来详细看待这项规定:一、 主要内容和核心措施: .............
  • 回答
    《寒蝉鸣泣之时 卒》在2021年7月与观众见面,作为《寒蝉鸣泣之时》系列(尤其是《业》)的续篇,它承载了无数期待,也注定会引发广泛的讨论。要评价这部作品,我得先说说它成功的地方,再聊聊它可能存在的一些争议点。亮点: 终章的收束感,对《业》的反思与升华: 这绝对是《卒》最核心的价值。前面《业》篇所.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有