【问题描述】
uninst.exe 文件是由安装程序(setup.exe)在执行安装的时候生成的。即使 setup.exe 有被签名,但是 uninst.exe 是没有签名的,导致安装程序会被安全软件(例如:360软件)拦截。
注:setup.nsi 是通过 WriteUninstaller "$INSTDIR\uninst.exe" 来生成卸载程序。
【解决方案一】
通过执行setup.exe(不要签名),先生成卸载程序,然后对卸载程序进行签名,再将卸载程序打包进setup.exe。
1)首先,由NSIS生成setup.exe,注意:不要对setup.exe进行签名。
2)执行setup.exe,待安装完成后,到安装目录找到uninst.exe,然后对uninst.exe进行签名。
3)将uninst.exe文件与需要被释放到安装目录下的文件一起打包。
4)注释掉setup.nsi文件中的这句:WriteUninstaller "$INSTDIR\uninst.exe"。
5)重新编译setup.nsi生成setup.exe,并对其进行签名。
【解决方案二】
整体思路跟方案一类似,就是在编译的时候生成卸载程序(uninst.exe),然后再打包到setup.exe中!但是是通过代码方式:
1)新建一个nsis工程uninstall.nsi。把setup.nsi里面的Function un.XX,都移到uninstall.nsi中去。
2)uninstall.nsi 的 section install中只保留:WriteUninstaller "$EXEDIR\uninst.exe" ;与setup.exe同目录
3)添加以下代码:
ShowInstDetails hide ; 设置是否显示安装详细信息nevershow
ShowUninstDetails hide ; 设置是否显示卸载详细信息nevershow
SilentInstall silent ; 静默安装
;SilentUnInstall silent ; 静默卸载
4)编译uninstall.nsi,并运行,就会在当前目录下生成uninst.exe。然后给它签名。
5)把生成的uninst.exe打包到setup.exe中,同时去掉:WriteUninstaller "$INSTDIR\uninst.exe"
6)setup.nsi中,用包含dll的方法包含uninst.exe文件。