agracio / electron-edge-js

Run .NET and Node.js code in-process on Windows, MacOS, and Linux

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

.NET and Node.js in-process on Electron

This is a fork of edge-js adapted to support Electron

Windows binaries pre-compiled for

Electron Node.Js x86/x64 arm64
Electron 23.x v18.12.1 ✔️
Electron 24.x v18.14.0 ✔️
Electron 25.x v18.15.0 ✔️
Electron 26.x v18.16.1 ✔️
Electron 27.x v18.17.1 ✔️
Electron 28.x v18.18.2 ✔️
Electron 29.x v20.9.0 ✔️ ✔️
Electron 30.1.x v20.14.0 ✔️ ✔️
Electron 31.x v20.14.0 ✔️ ✔️
  • You do not need to use the same version of Node.js in your project as Electron Node.js version
  • On Linux and macOS npm install will compile binaries with correct Node.Js headers for a given Electron version.

Usage is the same as edge-js, replace require('edge-js') with require('electron-edge-js'):

npm install electron-edge-js
-var edge = require('edge-js');
+var edge = require('electron-edge-js');

var helloWorld = edge.func(function () {/*
    async (input) => {
        return ".NET Welcomes " + input.ToString();
    }
*/});

Why use electron-edge-js?

Electron is built using specific version of Node.js. To use edge-js in Electron project you would need to recompile it using the same Node.js version and Electron headers.

electron-edge-js comes precompiled with correct Node.js versions and headers.

Quick start

Sample app that shows how to work with .NET Core using inline code and compiled C# libraries.
https://github.com/agracio/electron-edge-js-quick-start

Packaging Electron application

electron-edge-js needs to be specified as an external module, some examples

webpack.config.js

externals: {
    'electron-edge-js': 'commonjs2 electron-edge-js',
},
node: {
    __dirname: false,
    __filename: false,
},

vue.config.js

module.export = {
    pluginOptions: {
        electronBuilder: {
            externals:["electron-edge-js"]
        }
    }
}

From #138

webpack.config.js

externals: {
    'electron-edge-js': 'commonjs2 electron-edge-js',
},
node: {
    __dirname: false,
    __filename: false,
},
extraResources:[
    "./node_modules/electron-edge-js/**",
]

Electron main.js

// https://github.com/ScottJMarshall/electron-webpack-module-resolution
require("module").globalPaths.push(process.cwd()+'/node_modules');
var edge = require('electron-edge-js');

Packaging example based on electron-edge-js-quick-start.
https://github.com/zenb/electron-edge-js-quick-start

Related issues to use for troubleshooting:
#39
#74
#21

Async execution

If electron-edge-js module is used on main Electron thread it will cause Electron app to freeze when executing long-running .NET code even if your C# code is fully async.
To avoid this you can use worker thread packages such as threads.js or piscina

This issue is not present when using Electron IPC

Workaround from #97

main.js

const { fork } = require("child_process"); fork("../child.js", [], { env: {file: 'filename'}, })

child.js

const path = require('path');
const powerpoint = require('office-script').powerpoint;
const filePath = '../../directory/';

powerpoint.open(path.join(${remotePath}${process.env.file}.pptx), function(err) {
    if(err) throw err;
});

Build

build.bat supports only Electron major versions.

Documentation

For full documentation see edge-js repo.

About

Run .NET and Node.js code in-process on Windows, MacOS, and Linux

License:MIT License


Languages

Language:C++ 85.0%Language:C# 8.2%Language:JavaScript 5.2%Language:Python 0.9%Language:C 0.4%Language:Batchfile 0.2%Language:HTML 0.1%