# Using custom_main.js This guide explains how to include and use a `custom_main.js` file in your Electron.NET application for advanced Electron/Node.js customization. ## Why use custom_main.js? - Register custom protocol handlers (e.g., `myapp://`) — protocols must be registered before the app is fully initialized - Integrate Node.js modules (e.g., telemetry, OS APIs) - Control startup logic (abort, environment checks) - Modify Chromium / Electron.NET command line switches before they are evaluated - Set up IPC messaging or preload scripts ## Step-by-Step Process ### 1. Create the custom_main.js file Place your custom logic in `electron/custom_main.js`: ```javascript module.exports.onStartup = function(host) { // Example: Register a global shortcut for opening dev tools const { app, globalShortcut, BrowserWindow } = require('electron'); app.on('ready', () => { const ret = globalShortcut.register('Control+Shift+I', () => { BrowserWindow.getAllWindows().forEach(win => win.webContents.openDevTools()); console.log('Ctrl+Shift+I is pressed: DevTools opened!'); }); }); app.on('will-quit', () => { globalShortcut.unregisterAll(); }); return true; }; ``` ### 2. Configure your .csproj to copy custom_main.js to output Add this to your `.csproj` file: ```xml PreserveNewest .electron\custom_main.js ``` ### 3. Build and run your app Use the standard build/run commands: ```powershell dotnet build dotnet run ``` Electron.NET will automatically load and execute your `custom_main.js` before initializing the .NET backend. ## Advanced Usage Use environment variables to control features: ```javascript const env = process.env.ASPNETCORE_ENVIRONMENT || 'Production'; if (env === 'Development') { /* enable dev features */ } ``` ### Modifying Command Line Switches `onStartup` is invoked before Electron.NET reads any of its own switches (`manifest`, `unpackedelectron`, `unpackeddotnet`, `dotnetpacked`, `electronforcedport`, `electronurl`), so the hook can append or override them: ```javascript module.exports.onStartup = function (host) { const { app } = require('electron'); // Force a fixed socket bridge port app.commandLine.appendSwitch('electronforcedport', '8000'); // Chromium switches, e.g. to disable the GPU sandbox app.commandLine.appendSwitch('disable-gpu-sandbox'); return true; }; ``` ## Notes - `custom_main.js` must use CommonJS syntax (`module.exports.onStartup = ...`). - Place the file in your source directory and copy it to `.electron` using `.csproj`. - Electron.NET will abort startup if `onStartup` returns `false`. - `onStartup` runs before the Electron.NET command line switches are evaluated, so switches set there are picked up by the host. ### Complete example is available here [ElectronNetSampleApp](https://github.com/niteshsinghal85/ElectronNetSampleApp)