6

我有这样的事情:

<InstallExecuteSequence>
  <RemoveExistingProducts After="InstallValidate"/>
</InstallExecuteSequence>

由于其中一个卸载失败,我需要在 RemoveExistingProducts 之前执行自定义操作来解决问题。类似的东西:

<CustomAction Id="FixStuff" .. />

<InstallExecuteSequence>
  <Custom Action="FixStuff" Before="RemoveExistingProducts" />
  <RemoveExistingProducts After="InstallValidate"/>
</InstallExecuteSequence>

这当然不起作用,因为自定义操作不能在 InstallInitialize 之前。我真的很想删除 InstallValidate 和 InstallInitialize 之间的现有产品,但我想在删除现有产品之前执行 FixStuff。

甚至有可能做到这一点吗?

4

1 回答 1

7

不幸的是,您无法使用当前配置在 RemoveExistingProducts 之前运行提升的自定义操作。

一些可能的方法是:

  1. 在 InstallFinalize 之前移动 RemoveExistingProducts。这解决了自定义操作问题,但由于此方法有很多限制(组件需要在版本之间维护其名称和 GUID,您的自定义操作应该知道升级是在安装结束时执行等),因此可能会出现其他问题。

  2. 创建一个 EXE 引导程序,在启动新的 MSI 之前修复旧的安装程序。此引导程序可以通过清单要求管理员权限:

http://msdn.microsoft.com/en-us/library/bb756929.aspx

  1. 使用此方法修复损坏的 MSI:

    • 修复旧 MSI 中的问题
    • 创建一个 BAT 或 EXE 引导程序,通过以下命令重新缓存它:

    msiexec /fv <path_to_msi>

    • 在您的新软件包之前将此 MSI 作为更新分发

当您的新包运行 RemoveExistingProducts 时,旧缓存的 MSI 应该被修复并且应该正确卸载。

于 2010-12-23T07:44:06.910 回答