Wix自定义卸载操作 - 如何在msi删除文件之前运行

时间:2018-06-18 15:10:48

标签: installation wix windows-installer wix3.7

我有一个自定义操作,可以将文件添加到安装目录中。卸载程序时,另一个自定义操作会尝试删除这些文件,以便删除安装目录。

问题是我的自定义卸载操作在删除标准安装文件后运行,因此安装目录留在那里,尽管它是空的。

配置看起来类似于:

<CustomAction Id="AddFilesAction" BinaryKey="installerActions" DllEntry="AddFiles" Execute="deferred" Return="check" Impersonate="no" />
<CustomAction Id="CleanupAction" BinaryKey="installerActions" DllEntry="Cleanup" Execute="deferred" Return="check" Impersonate="no" />

<InstallExecuteSequence>
  <Custom Action="CleanupAction" Before="InstallFiles">Installed</Custom>
  <Custom Action="AddFilesAction" After="InstallFiles">NOT Installed</Custom>
</InstallExecuteSequence>

我可以在msi开始删除安装文件之前运行CleanupAction运行,以便自定义文件已被删除,msi可以删除主安装目录吗?

3 个答案:

答案 0 :(得分:6)

  

问题是我的自定义卸载操作在删除标准安装文件后运行

那是因为您已经在InstallFiles之前安排了RemoveFiles InstallExecuteSequence之后的Sequence。您还可以在Orca或InstEd等编辑器中打开MSI文件,并查看RemoveFiles表。按<Custom Action="CleanupAction" Before="RemoveFiles"> (REMOVE~="ALL") AND (NOT UPGRADINGPRODUCTCODE) </Custom> 列对其进行排序,以查看执行顺序。

  

我可以在msi开始删除之前运行CleanupAction   安装文件

当然,只需在RemoveFile之前安排它:

RemoveFolderEx

编辑:在SteinÅsmul让我意识到这一点后,我也改进了自定义动作条件。 standard InstallExecuteSequence详细推理。

如果您还不知道,WiX已经支持删除应用程序生成的文件,这些文件可能会替换您的自定义操作。它以See his answerRemoveFile元素的形式出现。

如果这些不满足您的需求,所以您仍然需要自定义操作,我建议在运行时为<{1}}表中添加要删除的文件的临时记录(在自定义操作!)。这为您提供了使用MSI引擎进行实际文件删除的好处,即:即如果用户决定取消卸载或发生错误,则自动回滚。我过去曾经这样做过(在发明index.html之前),所以如果你需要更多信息,可以问另一个问题。

答案 1 :(得分:4)

简答 :您的病情和排序似乎是错误的。请安排清理自定义操作在 RemoveFiles 之前运行,并且可能设置更好的条件,以便仅在需要时运行操作(不在意外的设置模式下)。我建议 (REMOVE~="ALL") AND (NOT UPGRADINGPRODUCTCODE) 。如果您使用此条件,请彻底测试。 此条件说明如下

快速示例

<InstallExecuteSequence>
  <Custom Action="CleanupAction" 
          Before="RemoveFiles">(REMOVE~="ALL") AND (NOT UPGRADINGPRODUCTCODE)</Custom>
</InstallExecuteSequence>

请务必阅读以下详细信息。您可能还希望收紧复制文件操作的条件 - 因为它也会在主要升级时运行 - 这可能是您想要的也可能不是。

自定义操作更改 Please avoid custom actions if you can - 一些自定义操作问题的摘要 - 它们很严重)。自定义操作是部署失败的主要原因。你确定需要它们吗?通常,还有其他方法可以使用内置MSI功能或特定于WiX的构造来实现您在自定义操作中实现的内容。常见的例子是:安装服务,删除文件,更新XML文件或INI文件等等......有时候自定义操作是必要的 - 显然。 Zett42 has already written well about the alternatives,所以我在此不再重复 - 请检查他/她的答案。

RemoveFiles :此处还有其他问题 - 我将尝试在下面介绍这些问题 - 但在标准操作 RemoveFiles时会卸载文件运行。换句话说,您需要将清理自定义操作安排在InstallExecuteSequence中的此标准操作之前运行。

条件 :您的清除自定义操作的条件 Installed 将使自定义操作在modify上运行,repairminor upgrade patching以及uninstallmajor upgrade initiated uninstalls。这很可能不是你想要的。要指定仅在卸载时运行,最常用的条件是 REMOVE~="ALL" 。这将使清理发生在手动启动的卸载以及主要升级启动的卸载(不是我想要的)。您可以尝试(REMOVE~="ALL") AND (NOT UPGRADINGPRODUCTCODE)(仅在常规卸载时运行 - 而不是在主要升级卸载时运行)。

提示 :即使对于有经验的WiX / MSI用户,条件也很容易搞砸。一些可能有用的资源:

更多链接(供参考)

答案 2 :(得分:0)

我不会在InstallInitialize和InstallFinalize之间安排您的操作。在Initialize之前放置文件并在Finalize之后清理文件。请注意,您将在InstallFinalize之后丢失属性值,并且您需要考虑到这一点。