Edge.js: run .NET and Node.js in-process on Electron
npm install electron-edge-jselectron-edge-js binaries will be compiled during npm install using node-gyp.
electron-edge-js binaries during npm install using node-gyp.
nan module compatibility issues versions prior to Electron 29 are not supported.
npm install will compile binaries with correct Electron headers for a given Electron version.
require('edge-js') with require('electron-edge-js'):
bash
npm install electron-edge-js
`
`diff
-var edge = require('edge-js');
+var edge = require('electron-edge-js');
var helloWorld = edge.func(function () {/*
async (input) => {
return ".NET Welcomes " + input.ToString();
}
*/});
`
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
Pre-requisites
- Windows: Visual C++ Redistributable
Packaging Electron application
electron-edge-js needs to be specified as an external module, some examples
$3
webpack.config.js
`js
module.exports = {
target: 'node',
externals: {
'electron-edge-js': 'commonjs2 electron-edge-js',
'edge-cs': 'commonjs2 edge-cs',
},
node: {
__dirname: true,
__filename: true,
},
}
`
$3
webpack.config.js
`js
externals: {
'electron-edge-js': 'commonjs2 electron-edge-js',
},
node: {
__dirname: false,
__filename: false,
},
extraResources:[
"./node_modules/electron-edge-js/**",
]
`
Electron main.js
`js
// https://github.com/ScottJMarshall/electron-webpack-module-resolution
require("module").globalPaths.push(process.cwd()+'/node_modules');
var edge = require('electron-edge-js');
`
$3
vue.config.js
`js
module.export = {
pluginOptions: {
electronBuilder: {
externals:["electron-edge-js"]
}
}
}
`
$3
When using dotnet Core CLR environment variable process.env.EDGE_USE_CORECLR needs to be set in Vite config instead of code.
vite.config.ts
`typescript
export default defineConfig(({ command }) => {
process.env.EDGE_USE_CORECLR = 1;
return {
// ..
}
});
`
Related issues to use for troubleshooting:
https://github.com/agracio/electron-edge-js/issues/39
https://github.com/agracio/electron-edge-js/issues/74
https://github.com/agracio/electron-edge-js/issues/21
https://github.com/agracio/electron-edge-js/issues/138
electron-builder
electron-builder example based on electron-edge-js-quick-start
https://github.com/agracio/electron-edge-js-quick-start-builder
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
$3
main.js
`js
const { fork } = require("child_process"); fork("../child.js", [], { env: {file: 'filename'}, })
`
child.js
`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.