运行已卸载应用程序

时间:2018-01-31 08:09:49

标签: wix windows-installer

在安装了另一个版本的同时执行安装时,我们需要调用一个自定义操作,该操作使用旧应用程序的exe(在删除之前)。自定义操作负责删除旧的计划任务。怎么会做这样的事情?

2 个答案:

答案 0 :(得分:0)

您可以在升级安装程序中实现此功能。

基本思路是你有一个延迟的自定义动作,只有当WIX_UPGRADE_DETECTED属性存在时才会运行。当您使用产品中的<MajorUpgrade> wix元素进行升级时,会设置此项。然后,您可以在RemoveExistingProducts之前安排自定义操作,并且它将能够删除计划任务。

这种做法有一些注意事项。

第一个警告是,此方法限制了您可以安排RemoveExistingProducts的位置。你必须安排&#34; afterInstallInitialize&#34;或以后。

如果您使用&#34; afterInstallInitialize&#34;然后安排自定义操作Before="RemoveExistingProducts"就可以了。如果您稍后在安装过程中安排RemoveExistingProducts,则可能需要对自定义操作Before="InstallFiles"进行简化,以防旧的exe或其可能加载的文件被新安装替换。

这个的基本实现可能看起来像这样

<MajorUpgrade Schedule="afterInstallInitialize" DowngradeErrorMessage="A newer version of [ProductName] is already installed."/>

<CustomAction Id="CA_RemoveScheduledTask" BinaryKey="CustomActionsDLL" DllEntry="RemoveScheduledTask" Execute="deferred" Return="check" />

<InstallExecuteSequence>
    <Custom Action="CA_RemoveScheduledTask" Before="RemoveExistingProducts">WIX_UPGRADE_DETECTED</Custom>
</InstallExecuteSequence>

您可能还需要将安装位置传递给自定义操作,该操作可以使用会话的CustomActionData属性进行访问。可以看到如何执行此操作的示例here。这只是为了获得exe位置的正确路径。通常我通过注册表项搜索获得安装路径。

答案 1 :(得分:0)

至少有两种方法可以长期使用,因为想要在另一个已安装的产品中运行自定义是不正常的。

  1. 如果在两个安装中都需要此可执行文件,则它是共享资源,并且可执行文件和自定义操作可能对两个安装都是通用的(可能在合并模块中以保持正确共享)。

  2. 如果在升级或卸载过程中某个时候调用自定义操作,那么在旧安装中调用自定义操作的条件似乎可能不正确。例如,如果在作为升级的一部分卸载它时应调用它,则调整UPGRADINGPRODUCTCODE上的调用。