添加 C++ 插件会导致打包的应用程序崩溃,但如果我 运行 'yarn start' 它会起作用

Adding a C++ addon causes the packaged app to crash, but it works if I run 'yarn start'

我正在使用 Electron-builder 来打包我的应用程序。

版本:22.4.0

目标:nsis

添加用 C++ 编写的自定义 grpc 客户端插件会使打包的应用程序崩溃。在我 运行 yarn dist 并使用生成的安装程序 exe 安装应用程序后,我尝试启动该应用程序。但是屏幕变白(即没有加载任何内容),大约 5 秒后,应用程序崩溃了。如果我使用 yarn/npm start 从节点启动应用程序,它工作正常,所以我不认为问题出在插件本身,可能是我在 package.json 中的设置;因为那是我至今最痛苦的事情。

我的包json文件:

{
  "name": "XYXYXYX",
  "version": "0.1.0",
  "description": "",
  "main": "app.js",
  "nodeGypRebuild":"true",
  "scripts": {
    "start": "electron .",
    "test": "echo \"Error: no test specified\" && exit 1",
    "pack": "electron-builder --dir",
    "dist": "electron-builder",
    "postinstall": "electron-builder install-app-deps"
  },
  "build": {
    "appId": "xfilter.optima",
    "win": {
      "target": "nsis"
    },
    "nsis": {
      "oneClick": false,
      "perMachine": true,
      "allowElevation": true,
      "runAfterFinish": false
    }
  },
  "author": "XXXX",
  "license": "SEE LICENSE IN LICENSE",
  "devDependencies": {
    "electron": "^8.0.0",
    "electron-builder": "^22.4.0"
  },
  "dependencies": {
    "electron-is-dev": "^1.1.0",
    "is-unc-path": "^1.0.0",
    "material-design-icons": "^3.0.1",
    "materialize-css": "^1.0.0-rc.2",
    "mongodb": "^3.5.2",
    "node-addon-api": "*",
    "sharp": "^0.24.1",
    "typeface-roboto": "0.0.75"
  }
}

此外,有趣的是,应用程序似乎并没有在 require() 语句处崩溃,而是当我 运行 从我的 C++ 端导出的函数时崩溃。

C++ 表面(以防万一):

#include <napi.h>

#include <ApiWorker.h>

using namespace Napi;

void runFilter(const CallbackInfo& info)
{
    String panel_id =  info[0].As<String>();
    Function callback = info[1].As<Function>();

    ApiWorker* _apiworker = new ApiWorker(panel_id, callback);
    _apiworker->Queue();
}

Object Init(Env env, Object exports)
{
    exports.Set(String::New(env, "runFilter"),
                Function::New(env, runFilter));

    return exports;    
}

NODE_API_MODULE(NODE_GYP_MODULE_NAME, Init)

我正在尝试像

一样调用 runFilter()
const filter = require('addon.node')
filter.runFilter("foobar", () => {console.log("Done");})

ApiWorker 是一个 AsyncWorker(派生自 Napi::AsyncWorker

PS:如果我在开发模式下运行,那么devtools会崩溃(见附件)

这是一个权限问题。

#4818

Figured out what the issue was. Because of "perMachine": true and "allowElevation": true, the program was getting installed into C:\ProgramFiles as an elevated user. But when I run it, it runs as a lower level user who doesn't have permission to write to the folder.

Can be fixed by only installing for the current user (i.e. "perMachine": false)