Electron 调用 dll 的实现与应用
dll 是 Dynamic Link Library 的缩写,意为 动态链接库 。在 Windows 中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即 dll 文件,放置于磁盘中。当我们执行某一个程序时,相应的 dll 文件就会被调用。一个应用程序可有多个 dll 文件,一个 dll 文件也可能被几个应用程序所共用。
一般来说, dll 是一种磁盘文件,通常以.dll、.drv、.fon、.sys 和许多以 .exe 为扩展名的系统文件都可以是 dll 。它由全局数据、服务函数和资源组成,在运行时被系统加载到调用进程的虚拟空间中,成为调用进程的一部分。 dll 模块中包含各种导出函数,用于向外界提供服务。
在 Windows 桌面应用开发中,当涉及到硬件通信时,就不可避免的要调用第三方硬件厂商的提供的 SDK 进行经验通信。这些不同厂商会提供支持不同平台的 SDK 供我们使用,然而在 Windows 平台,通常都是只提供 dll 动态链接库。
这就给使用 Electron 开发的桌面应用带来了很大的困扰。在之前的使用场景中,我们尝试过借助 .NET 将 dll 封装为 exe 控制台程序。再使用 Node.js spawn 去启动 exe,二者通过 stdio 进行通信,间接实现了 Node.js 调用 dll 。然而这种方式不仅严重依赖 C# 开发,同时在 node 子进程调用 exe 程序的性能更是不忍直视,多的时候甚至有数秒延迟。因此绝对不是最佳方案。
好在最近对 TSC 打印机官网提供的 Node.js 示例进行了深入学习,最终实现 Node.js 直接调用 dll 动态链接库 ,不仅完全摆脱了 C# 依赖,同时使单次打印速度提升了 1 ~ 2 秒。
edge-js
edge-js 是 Edge.js 的一个分支,作为目前的活跃版本实际上可以看做新版的 Edge.js。
edge-js 提供了一种能够让 Node.js 和 .NET 程序运行在一个进程的机制,因此性能很好,同时处理单个进程而不是两个进程之间的通信通道可以降低程序复杂度和维护复杂性。
Node.js 本身支持使用 C/C++ 编写本机 Node.js 扩展来访问尚未通过 Node.js 公开的特定于操作系统的能力。edge-js 的初衷是为开发者提供使用 .NET Framework 和 C# 为 Node.js 编写扩展,因此也就使的 Node.js 有了通过 edge-js 调用 dll 的能力。
以 Windows 平台为例,想要实现 Node.js 通过 edge-js 调用 dll 。我们首先要构建一个支持 C# 扩展的 Node.js 出来,我们可以使用 edge-js 提供的 buildall.bat 工具来实现这一步。但是前提条件是要完成搭建 Visual Studio 2017 C++ 工具集 、 Python 3.6.x 和 node-gyp 环境后才能进行构建。而且构建时我们需要指定确切的 Node.js 版本号:
tools\buildall.bat release [Node.js正式版本号]
构建完成后你会在 node_modules/edge-js/lib/native/win32 中看到构建结果。
完成以上操作,你就可以正常启动 TSC 打印机官方提供的示例调用 tsclibnet.dll 了。
electron-edge-js
而在应用方面, edge-js 贴心的为我们准备了 electron-edge-js 扩展。
如果想要将 edge-js 集成在 Electron 桌面应用程序中,我们就不可避免的要针对不同版本 Electron 内置的 Node.js 版本进行编译,而 edge-js 考虑到了这一点。
同时因为每个大版本 Electron 内置的 Node.js 版本都是确定的,因此 electron-edge-js 主要做的就是帮助我们编译好了各个 Electron 版本需要的集成了 edge-js 的 Node.js。这里有一张来自文档的列表:
- Electron 2.x - Node.js v8.9.3.
- Electron 3.x - Node.js v10.2.0.
- Electron 4.0.4+ - Node.js v10.11.0.
- Electron 5.x - Node.js v12.0.0.
- Electron 6.x - Node.js v12.4.0.
- Electron 7.x - Node.js v12.8.1
- Electron 8.x - Node.js v12.13.0
- Electron 9.x - Node.js v12.14.1
- Electron 10.x - Node.js v12.16.3
- Electron 11.x - Node.js v12.18.3
- Electron 12.x - Node.js v14.16.0
- Electron 13.x - Node.js v14.16.0
- Electron 14.x - Node.js v14.17.0
- Electron 15.x - Node.js v16.5.0
- Electron 16.x - Node.js v16.9.1
- Electron 17.x - Node.js v16.13.0
- Electron 18.x - Node.js v16.15.1
想要在 Electron 中 运行 edge-js 只需要将 edge-js 替换为 electron-edge-js 即可。
mac
受客观原因限制,目前 edge-js 并没有将指定 Node.js 版本编译为可以在 mac 电脑运行的实现(多次尝试未果)。目前以上探索尽在 Windows 平台可用。
应用
使用 dll 打印相比 electron + 打印机驱动打印打印效率单次提升1s~+。