我正在开发一个使用 WIX 安装应用程序的项目。要求之一是在安装当前版本之前删除旧版本。旧版本不是基于 MSI 的,它是使用 SetupApi(依赖于 inf 文件)创建的。
我认为这可以通过自定义操作来实现,逻辑如下:
- 在HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%NAME%中查找“古代”版本,并尽可能提取UninstallString值
- 如果设置了该值,则运行将执行该命令的自定义操作,通常它是一个字符串,如RunDll32 advpack.dll,LaunchINFSection C:\PROGRA~1\PROGRAM\file.inf, DefaultUninstall
- 此操作必须在安装程序之前执行,因为它们具有共享文件和注册表项。如果在 MSI 安装结束时执行自定义操作,它将破坏程序
我的问题是:
- 这是删除旧的基于 INF 程序的推荐方法吗?
有没有办法静默卸载基于 INF 的程序?否则用户体验会很差——一个人正在安装一个程序,突然他们看到一个“卸载程序”窗口。这是反直觉的。[通过在卸载命令中添加“,3”解决]
如果您有兴趣,这里是执行我上面描述的代码片段:
<Property Id="ANCIENTVERSION">
<RegistrySearch Id="RegistrySearchAncientVersion" Type="raw"
Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Program"
Name="UninstallString" />
</Property>
<CustomAction Id="removeAncientVersion"
Directory="SystemFolder"
<!--ExeCommand="[ANCIENTVERSION]" regular uninstall-->
ExeCommand="[ANCIENTVERSION],3" <!--silent uninstall-->
Execute="immediate"
Return="check"/>
<InstallExecuteSequence>
<Custom Action='removeAncientVersion' After='InstallValidate'>ANCIENTVERSION</Custom>
</InstallExecuteSequence>