我有一套基于WiX的安装程序用于一套应用程序。它取代了一堆旧安装程序,其中套件中的每个应用程序都有自己的基于InstallShield的安装程序。
我希望WiX安装程序能够找到任何旧的基于InstallShield的安装并运行各自的卸载程序。我试过这个:
<Property Id="OLD_APPLICATION_A_UNINSTALLSTRING">
<RegistrySearch Id="OldAppAUninstallString" Root="HKLM"
Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{$(var.OldAppAInstallerGUID)}"
Name="UninstallString" Type="raw"/>
</Property>
<InstallExecuteSequence>
<Custom Action="UninstallAppA" Before="InstallInitialize">
NOT Installed AND OLD_APPLICATION_A_UNINSTALLSTRING
</Custom>
</InstallExecuteSequence>
<CustomAction Id="UninstallAppA" Directory="System32"
ExeCommand="[OLD_APPLICATION_A_UNINSTALLSTRING] /qn" Execute="immediate" Return="check"/>
这导致安装失败和错误状态1618:&#34;另一个安装已在进行中。在继续此安装之前完成该安装。&#34;只有一个其他安装正在进行中,此安装...
有没有办法在WiX中从安装程序运行卸载程序?
我也有一个bootstrapper,也许我应该以某种方式从那里运行这些卸载。但是我希望尽可能晚地运行它们,以防用户取消安装。如果发生这种情况,如果旧的应用程序套件消失,它看起来并不太好......
答案 0 :(得分:1)
在MSI中,有一个互斥锁可以防止两个安装事务(执行序列)同时运行,从而导致错误。
您可以使用其他升级元素通过UpgradeCode / Version / Lanugage查找它们,并在安装过程中将其删除。