This is a fork of edge-js adapted to support Electron
electron-edge-js allows you to run .NET code in Electron process on Windows, macOS, and Linux.
Call compiled .NET dlls or inline C# code directly from Electron process.
Electron officially supports 3 latest released versions. You can read more about Electron release schedule and support here Electron Releases.
- Windows supports 6 latest Electron releases.
- macOS comes pre-compiled with 6 latest Electron releases. When using Electron version that is not pre-compiled
electron-edge-js
binaries will be compiled duringnpm install
usingnode-gyp
. - Linux will will always compile
electron-edge-js
binaries duringnpm install
usingnode-gyp
.
Electron | x86/x64 | arm64 |
---|---|---|
33.x - 38.x | ✔️ | ✔️ |
Electron | x64 | arm64 |
---|---|---|
33.x - 38.x | ✔️ | ✔️ |
Electron | x64 | arm64 |
---|---|---|
29.x - 38.x | ✔️ | ✔️ |
On Linux npm install
will compile binaries with correct Electron headers for a given Electron version.
Electron | x64 | arm64 |
---|---|---|
29.x - 38.x | ✔️ | ✔️ |
Other Linux architectures might work but have not been tested.
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(); } */});
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
- Windows: Visual C++ Redistributable
electron-edge-js
needs to be specified as an external module, some examples
webpack.config.js
module.exports = { target: 'node', externals: { 'electron-edge-js': 'commonjs2 electron-edge-js', 'edge-cs': 'commonjs2 edge-cs', }, node: { __dirname: true, __filename: true, }, }
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');
vue.config.js
module.export = { pluginOptions: { electronBuilder: { externals:["electron-edge-js"] } } }
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
export default defineConfig(({ command }) => { process.env.EDGE_USE_CORECLR = 1; return { // .. } });
Related issues to use for troubleshooting:
#39
#74
#21
#138
electron-builder example based on electron-edge-js-quick-start
https://github.com/agracio/electron-edge-js-quick-start-builder
electron-forge example based on electron-edge-js-quick-start
https://github.com/agracio/electron-edge-js-quick-start-forge
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; });
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.
For full documentation see edge-js repo.