node js 调用dll 方案

最近准备用node js 写一个项目,所以需要对方案进行调研,项目会用到c的dll,通过网上查资料发现基本2种方案:1:ffi 2:addon

ffi 方案

这个方案我经过一天测试,发现这个方案不行,我建议直接放弃,第一个问题安装ffi 编译不通过,通过大量资料查询因为他不支持node 12 ,我通过使用别人ffi-napi 解决这个问题,然后遇到字符串问题,以前的接口默认是wchar_t * ,发现无论使用ref-wchar_t-napi 都无法使用宽直接,后面实在没有办法,我直接转换dll的接口改成utf-8进行传递,来解决字符串问题。最恐怖我发现ffi这个方案内存泄漏实在恐怖了,我防止是我自己API的问题,我直接调用系统的API,发现如果调用很频繁会导致内存泄漏,这点我完全无法接受,因为我的程序需要长期后台运行,那么内存问题是一个恐怖的问题

ffi测试代码

k = ffi.Library("Kernel32", {
  'OutputDebugStringA': ['void', ['string']],
});


var sleep = require('sleep');
for(var i = 0 ; i < 10000; i++){
  var r = k.OutputDebugStringA('' + i);
  r = null;
}

//等待100秒,观察内存是否释放,时间可以设置更长
sleep.sleep(100);

我自己观察内存一直私有内存一直增加,循环跑完也没有回收,那么说明ffi 有内存泄漏

addon

这个用起来挺简单,本质在windows就是一个DLL,通过工具生成一个动态库工程,然后直接按照例子写代码就可以了,也方便自己写代码,这里面有几种,我目前建议采用napi这种,这种就是没有v8版本,导致编译的问题,上面ffi编译的问题就是这个原因。

使用过程:

  • 百度一个addon教程
  • 找到nodejs 官方例子,直接按照例子写就可以 https://github.com/nodejs/node-addon-examples
  • 直接跑就可以(node32 才能加载win32 dll 不然会报错),上一个方案时候就出现加载问题,目前我用node32 12的版本

备注

nodejs 开发代码确实方便很多,但从一个技术方案迁移到另外一个技术方案,成本还真不少。ffi 内存泄漏,这个就不用考虑,ffi本质也是addon技术实现,这种中间件,但网上貌似都没有遇到这个问题一样,我直接测试好几个例子都会内存泄漏。ffi可以不用自己开发一个dll来做桥梁,addon需要自己单独写一个新的dll来调用原来的dll。