ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Electron.NET 自定义 custom_main.js 指南:在主进程启动前注入高级 Electron/Node.js 定制逻辑

Electron.NET 自定义 custom_main.js 指南:在主进程启动前注入高级 Electron/Node.js 定制逻辑 桌面应用跨平台【免费下载链接】Electron.NET:electron: Build cross platform desktop apps with ASP.NET Core (Razor Pages, MVC, Blazor).项目地址https://gitcode.com/gh_mirrors/el/Electron.NET点击查看免费下载导读custom_main.js是 Electron.NET 提供给开发者的一扇后门它允许你在 Electron 主进程完成初始化、.NET 后端启动之前插入一段纯 JavaScript 逻辑用于注册自定义协议、加载 Node.js 模块、改写 Chromium/Electron 命令行开关、控制启动流程等。读完本文你将掌握custom_main.js的完整接入流程文件编写、.csproj配置、构建运行、onStartup(host)钩子的执行时机与返回值约定并能利用源码级依据理解它为何能在 Electron.NET 读取自身开关之前生效。为什么需要 custom_main.jsElectron.NET 在架构上把 .NET 后端与 Electron 主进程分离开主进程由 main.js 驱动负责读取命令行开关、加载package.json清单、建立 Socket.IO 桥接并最终拉起 .NET 后端进程。在常规用法中你通过 C# API如Electron.App、Electron.IpcMain与主进程通信但有些场景必须在主进程最早阶段用原生 Node.js/Electron API 完成例如注册自定义协议处理器如myapp://——协议必须在 app 完全初始化之前注册集成 Node.js 模块遥测、OS 级 API 等控制启动逻辑——做环境检查、决定是否中止启动修改 Chromium / Electron.NET 命令行开关——必须在开关被求值之前完成提前搭建 IPC 消息通道或 preload 脚本。custom_main.js正是为这类最早时机定制而设计的注入点。custom_main.js 的执行机制源码视角在深入配置之前先看钩子的真实实现。在 src/ElectronNET.Host/main.js 的顶部宿主进程在读取任何开关之前执行以下逻辑try { const fs require(fs); const customMainPath path.join(__dirname, custom_main.js); if (fs.existsSync(customMainPath)) { const customMain require(customMainPath); if (customMain typeof customMain.onStartup function) { const continueStartup customMain.onStartup(globalThis); if (continueStartup false) { // 立即终止应用 try { app.exit(0); } catch (err) { process.exit(0); } } } else { console.warn(custom_main.js found but no onStartup function exported.); } } } catch (err) { console.error(Error while executing custom_main.js:, err); }从这段源码可以确认以下关键事实文件位置固定宿主进程在__dirname即.electron输出目录下查找custom_main.js文件不存在时钩子被静默跳过必须导出onStartup文件必须使用 CommonJS 语法导出onStartup函数若文件存在但未导出该函数控制台会输出警告执行时机最早该代码位于app.on(ready)注册、manifest/unpackedelectron/unpackeddotnet/dotnetpacked/electronforcedport/electronurl等开关读取之前见 main.js因此钩子内设置的开关一定能被宿主后续逻辑读到返回false即中止启动onStartup返回false时宿主会调用app.exit(0)退出用于启动前检查失败则中止的控制流。分步接入三步让 custom_main.js 生效第 1 步创建 custom_main.js将你的定制逻辑放入electron/custom_main.js源项目根下的electron目录最终会被拷贝到输出目录.electron。文档给出的典型示例——注册CtrlShiftI 打开 DevTools的全局快捷键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(ControlShiftI, () { BrowserWindow.getAllWindows().forEach(win win.webContents.openDevTools()); console.log(CtrlShiftI is pressed: DevTools opened!); }); }); app.on(will-quit, () { globalShortcut.unregisterAll(); }); return true; };几点说明onStartup(host)收到的host参数是宿主进程的globalThis你可以在钩子中访问或挂载全局对象require(electron)在钩子内是可用的宿主进程本身就是 Electron 运行时globalShortcut是全局快捷键 API注册后即使窗口失焦也生效与 src/ElectronNET.Host/api/globalShortcut.ts 暴露给 C# 侧的globalShortcut-register通道是同一个底层 API在钩子里直接调用与通过 C#Electron.GlobalShortcut调用效果一致只是时机更早记得在will-quit中调用globalShortcut.unregisterAll()清理注册避免快捷键残留。第 2 步配置 .csproj 将文件拷贝到输出custom_main.js必须出现在宿主进程的__dirname即输出目录的.electron子目录中因此需要在.csproj中声明拷贝规则。向你的.csproj添加ItemGroup None Updateelectron\custom_main.js CopyToOutputDirectoryPreserveNewest/CopyToOutputDirectory TargetPath.electron\custom_main.js/TargetPath /None /ItemGroupCopyToOutputDirectory取PreserveNewest保证每次构建时源文件若有更新就重新拷贝TargetPath为.electron\custom_main.js正好落入宿主进程查找的目录Windows 下使用反斜杠Linux/macOS 构建时斜杠写法亦兼容MSBuild 会按平台处理路径分隔符。第 3 步构建并运行使用标准命令构建运行即可dotnet build dotnet runElectron.NET 会在初始化 .NET 后端之前自动加载并执行你的custom_main.js这一顺序由 main.js 的代码位置保证钩子在最顶部执行而 .NET 后端只有在 Socket 桥接监听成功后才会由startAspCoreBackend/startAspCoreBackendUnpackaged拉起见 main.js。高级用法用环境变量控制功能开关onStartup运行在 Electron/Node.js 进程内可以读取进程环境变量做分支控制const env process.env.ASPNETCORE_ENVIRONMENT || Production; if (env Development) { /* enable dev features */ }ASPNETCORE_ENVIRONMENT与 .NET 侧的环境名称一致Development/Production等因此可以用同一套环境约定同时在 C# 与主进程中控制行为。在 onStartup 中改写命令行开关onStartup之所以能改写 Electron.NET 自身的开关是因为钩子在宿主求值这些开关之前执行。宿主随后会按顺序读取以下开关对应 main.js开关作用manifest指定清单文件名默认package.jsonmanifestJsonFileNameunpackedelectron非打包模式使用解包的 Electron 与项目目录结构unpackeddotnet非打包模式.NET 后端以解包方式启动dotnetpacked打包模式默认构建产物走该分支electronforcedport强制指定 Socket 桥接端口默认动态分配electronurl指定 Electron 加载的 URL例如强制桥接端口并在 Chromium 层面禁用 GPU 沙箱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; };值得注意的实现细节electronforcedport的默认值来自 .NET 侧在 src/ElectronNET.API/Runtime/Services/ElectronProcess/ElectronProcessActive.cs 中宿主启动命令为main.js -unpackeddotnet --trace-warnings -electronforcedport{port}非打包或-dotnetpacked -electronforcedport{port}打包。也就是说端口通常由 .NET 运行时动态分配并透传你在钩子里覆写该开关即可固定端口覆写时序合法钩子执行后宿主才调用app.commandLine.hasSwitch(...)读取开关见 main.js因此钩子里appendSwitch(electronforcedport, 8000)的结果会覆盖 .NET 侧传入的值并直接影响后续startSocketApiBridge(electronforcedport)的监听端口Chromium 开关同理disable-gpu-sandbox这类 Chromium 级开关也在app.ready之前追加会被 Electron/Chromium 完整接收。结合 C# 侧 HostHook 与 IPC 打通 .NET ↔ 主进程custom_main.js擅长最早时机的初始化而运行时动态交互则交给 HostHook 与 IPC 机制HostHook通过electronize add HostHook在项目中生成ElectronHostHook目录后即可用Electron.HostHook.Call(...)/CallAsyncT(...)从 C# 调用宿主中已注册的 JS 回调见 src/ElectronNET.API/API/HostHook.cs。参考示例 src/ElectronNET.Samples.ElectronHostHook/ElectronHostHook/index.ts 中的onHostReady模式IPC主进程通过 src/ElectronNET.Host/api/ipc.ts 暴露ipcMain的注册、发送、handle 等通道C# 侧用Electron.IpcMain对应调用。你可以把custom_main.js视为开机自检 早期初始化层HostHook 视为运行期双向调用层两者互补。使用要点与注意事项以下是文档与源码共同确认的约束务必遵守必须使用 CommonJS 语法module.exports.onStartup function(host) { ... }不能用 ESM 的export文件必须落位到.electron在源码目录创建electron/custom_main.js并通过.csproj的CopyToOutputDirectoryTargetPath拷入.electron否则宿主在__dirname下找不到它返回false会中止启动onStartup返回false时宿主调用app.exit(0)立即退出可用于环境校验不通过时拒绝启动执行时机在开关求值之前因此钩子内追加的electronforcedport、electronurl等 Electron.NET 开关都会被宿主后续逻辑拾取出错会被捕获但不会崩溃启动钩子抛出的异常被try/catch捕获并输出console.error宿主继续运行见 main.js若钩子存在但未导出onStartup则输出警告后继续见 main.js避免重复注册onStartup只执行一次宿主进程单实例但如果你在钩子与 C# API 中注册了相同语义的全局快捷键或 IPC 通道注意去重防止冲突。相关资源与延伸阅读宿主主进程实现src/ElectronNET.Host/main.js.NET 侧启动 Electron 进程的完整参数构造src/ElectronNET.API/Runtime/Services/ElectronProcess/ElectronProcessActive.cs启动方法打包/非打包/主动/被动说明Startup-Methods.md从 C# 调用宿主 JS 的 HostHook APIHostHook.cs 与 HostHook 文档主进程侧暴露的 IPC 通道实现ipc.ts全局快捷键通道实现globalShortcut.ts命令行开关通道实现commandLine.tsHostHook 集成测试示例HostHookTests.cs赞分享桌面应用跨平台【免费下载链接】Electron.NET:electron: Build cross platform desktop apps with ASP.NET Core (Razor Pages, MVC, Blazor).项目地址https://gitcode.com/gh_mirrors/el/Electron.NET点击查看免费下载相关推荐WXT Hooks 完全指南在构建流程中注入自定义逻辑WXT Hooks 完全指南在构建流程中注入自定义逻辑 WXT 内置了一套基于 hookable 的钩子系统允许你在构建、打包、类型生成、开发服务器等关键节前端开发工具构建工具插件系统mailcow-dockerized 容器自定义扩展指南利用 data/hooks 钩子机制注入启动逻辑mailcow dockerized 容器自定义扩展指南利用 data/hooks 钩子机制注入启动逻辑 导读 mailcow dockerized 以 Do后端企业应用electron-builder 构建钩子Hooks完全指南在构建生命周期中注入自定义逻辑electron builder 构建钩子Hooks完全指南在构建生命周期中注入自定义逻辑 导读 本文深入讲解 electron builder 的 Bu构建工具桌面应用开发工具上一篇Sherlock终极指南如何快速查找用户名在400社交平台的踪迹下一篇深入理解Crafting Interpreters类型系统实现的艺术与科学创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表