【问题标题】:Is there a way to run uninstallers from an installer in WiX?有没有办法从 WiX 中的安装程序运行卸载程序?
【发布时间】:2015-06-21 05:09:49
【问题描述】:

我有一套应用程序的基于 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:“另一个安装已在进行中。完成该安装,然后再继续此安装。”只有另一个安装正在进行中,这个安装...

有没有办法从 WiX 中的安装程序运行卸载程序?

我也有一个引导程序,也许我应该从那里以某种方式运行这些卸载。但我想尽可能晚地运行它们,以防用户取消安装。如果发生这种情况,如果旧的应用程序套件消失了,那看起来不太好......

【问题讨论】:

    标签: wix windows-installer


    【解决方案1】:

    在 MSI 中,有一个互斥锁可防止两个安装事务(执行序列)同时运行,从而导致您的错误。

    您可以使用其他升级元素通过 UpgradeCode/Version/Lanugage 查找它们,并在您的安装事务期间将它们删除。

    【讨论】:

    • 您有示例如何以这种方式使用 MajorUpgrade 吗?我对该元素的理解是,它使用其父 Product 元素的 UpgradeCode 来查找一个旧产品。我有大约十个不同的 InstallShield 安装“升级代码”/GUID 来查找(和卸载)。 WiX 文档没有为这种情况提供太多帮助。
    • 啊,是的,我的错。 MajorUpgrade 是更高级别的抽象,它做出某些假设,例如使用您自己的 UpgradeCode。请改用升级元素(答案已更新)。您将需要 10 个升级元素,每个元素搜索与 10 个不同 UpgradeCode 系列匹配的产品。
    • 我还没有让它工作,但你解释了为什么我的解决方案没有工作,升级元素似乎是正确的方法。也许我使用错误的 GUID 来查找旧的 InstallShield 安装。我接受这个作为答案。
    猜你喜欢
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 2015-10-22
    相关资源
    最近更新 更多