electron调用基于napi的addon踩坑

  最近写一个东西,界面基于electron,需要使用一些底层功能,所以将底层功能写成addon供electron调用。本人喜欢用vs开发,因为有些复杂的工程用node-gyp这种配置比较麻烦,所以研究了下vs写的addon。

  首先确定electron的node版本:electron版本列表

  然后确定该node使用的napi版本:node使用的napi版本

  只要lib中napi的版本对上了就行了。其实如果不是electron而是node来调用,那么用vs写一个dll,链接到对应版本的node.lib,然后配置里将后缀名改成.node,是可以直接require这个dll的,所以从本质说.node就是一个dll。

  但是如果换成electron就不行了,想了很久找到了原因。用depends查看生成的addon的话,会发现addon导入的还是node.dll,而electron是将node集成在内部的,而不是额外load这个node.dll,可以发现这些napi是在electron导出的:
electron调用基于napi的addon踩坑_第1张图片
  所以说electron在LoadLibrary这个addon时,找不到node.dll,也就无法完成函数导入。那么思路就明确了,这时候需要想办法让node.lib在链接时告诉我的addon导入的不是node.dll而是electron.exe。这时候就想到构造def文件重新生成lib,用新的lib来链接。

  用depends打开electron.exe,然后右键右下的导出列表,选择select all,继续选择copy function names,然后打开一个记事本,头两行写上:

LIBRARY electron.exe
EXPORTS

  然后再粘贴,把所有的导出函数粘贴到下面,保存为一个electron.def文件。
然后找到vs下的lib.exe,执行命令

lib /def:C:\Tools\bin\electron.def /machine:amd64 /out:C:\Tools\bin\electron.lib

  这样就会生成一个包含所有napi导出函数的lib。然后把addon和这个lib链接生成.node文件就可以在electron中require了。

你可能感兴趣的:(electron调用基于napi的addon踩坑)