Squirrel自动创建快捷方式并执行包内NSSM第三方EXE的问题问询
问题根因
Squirrel默认会扫描安装包内所有.exe后缀的文件,将其全部识别为应用程序入口,自动为其创建桌面、开始菜单快捷方式,且在首次安装后自动启动。你的C#主程序已适配Squirrel事件规则,但NSSM作为第三方工具没有对应的Squirrel适配逻辑,因此会触发默认处理流程。
可用解决方案
方案1:打包时修改NSSM文件后缀(最稳妥)
这是成本最低且兼容性最好的方案:
- 打包前将
nssm.exe重命名为nssm.bin(或其他非.exe后缀),再放入安装包目录 - 在你已实现的Squirrel事件中增加重命名逻辑,在程序首次运行时将文件改回
.exe后缀即可,参考代码:
using (var mgr = new UpdateManager("http://updatepath")) { SquirrelAwareApp.HandleEvents( onInitialInstall: v => { MessageBox.Show("onInitialInstall"); // 重命名NSSM文件 var nssmBinPath = Path.Combine(AppContext.BaseDirectory, "nssm.bin"); var nssmExePath = Path.Combine(AppContext.BaseDirectory, "nssm.exe"); if (File.Exists(nssmBinPath)) { File.Move(nssmBinPath, nssmExePath); } // 仅为你自己的主程序创建快捷方式 mgr.CreateShortcutForThisExe(); }, onAppUpdate: v => { MessageBox.Show("onAppUpdate"); // 更新时也检查一次重命名逻辑 var nssmBinPath = Path.Combine(AppContext.BaseDirectory, "nssm.bin"); var nssmExePath = Path.Combine(AppContext.BaseDirectory, "nssm.exe"); if (File.Exists(nssmBinPath)) { File.Move(nssmBinPath, nssmExePath); } mgr.CreateShortcutForThisExe(); }, onAppUninstall: v => mgr.RemoveShortcutForThisExe(), onFirstRun: () => MessageBox.Show("onFirstRun")); }
Squirrel不会处理非.exe后缀的文件,因此不会自动为nssm.bin创建快捷方式或启动。
方案2:打包时添加排除参数
如果你使用Squirrel CLI执行releasify命令打包,直接添加--exclude参数指定排除nssm.exe的快捷方式生成规则即可:
Squirrel --releasify 你的应用包名.nupkg --exclude "nssm.exe"
该参数会告诉Squirrel不要对nssm.exe执行创建快捷方式、自动启动的默认逻辑。
方案3:事件处理中主动删除NSSM的快捷方式
如果不想修改文件或打包参数,可以在Squirrel的安装/更新事件中主动调用接口删除NSSM对应的快捷方式:
onInitialInstall: v => { mgr.CreateShortcutForThisExe(); // 删除NSSM的所有快捷方式 mgr.RemoveShortcutsForExecutable("nssm.exe", ShortcutLocation.Desktop | ShortcutLocation.StartMenu); }
这个方案缺点是Squirrel会先创建NSSM的快捷方式再被你删掉,极端情况下用户可能会看到桌面闪过NSSM的图标再消失,不如前两个方案体验好。
内容的提问来源于stack exchange,提问作者James Harcourt
相关产品推荐
相关产品推荐

