Skip to content

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

License

Notifications You must be signed in to change notification settings

agracio/electron-edge-js

Repository files navigation

.NET and Node.js in-process on Electron

Actions Status Git Issues Closed Issues

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

Windows binaries pre-compiled for

Electron Node.Js x86/x64 arm64
Electron 29.x v20.x ✔️ ✔️
Electron 30.x v20.x ✔️ ✔️
Electron 31.x v20.x ✔️ ✔️
Electron 32.x v20.x ✔️ ✔️
Electron 33.x v20.x ✔️ ✔️
  • 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: true,
    __filename: true,
},

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');

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

electron-forge

electron-forge example based on electron-edge-js-quick-start
https://github.com/agracio/electron-edge-js-quick-start-forge

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;
});

Window refresh issue

If electron-edge-js module is used on main Electron thread refreshing the window (F5, Ctrl+R, Command+R etc) will cause a hard crash in electron-edge-js module and Electron app.
Currently there is no solution to this issue other than using Electron IPC.

Build

build.bat supports only Electron major versions.

Documentation

For full documentation see edge-js repo.