【发布时间】:2018-11-19 01:52:42
【问题描述】:
应该在InstallExecuteSequence table sequence 中的哪个位置放置自定义操作类型 18(执行作为安装一部分的应用程序),以便它仅在卸载期间运行,因为 "REMOVE="ALL" 或"Installed" 条件已应用于它 - 所以它在运行之前不会被删除?
【问题讨论】:
标签: windows-installer uninstallation custom-action
应该在InstallExecuteSequence table sequence 中的哪个位置放置自定义操作类型 18(执行作为安装一部分的应用程序),以便它仅在卸载期间运行,因为 "REMOVE="ALL" 或"Installed" 条件已应用于它 - 所以它在运行之前不会被删除?
【问题讨论】:
标签: windows-installer uninstallation custom-action
你使用什么工具?这是一个快速的WiX sn-p:
Synchronous、deferred execution in system context、ignore exit code、run on all types of uninstalls(也是主要的升级卸载)和running before the RemoveFiles Action:
<CustomAction Id="RunExeUninstall" FileKey="notepad.exe" ExeCommand=""
Return="ignore" Execute="deferred" Impersonate="no" />
<...>
<InstallExecuteSequence>
<Custom Action="RunExeUninstall" Before="RemoveFiles">REMOVE="ALL"</Custom>
</InstallExecuteSequence>
Orca:当使用Orca 查看时,上述内容应在CustomAction table 中产生类似的内容:
|
Action: RunExeUninstall |Type: 3154 |Source: 文件名.exe |Target:|
一般在标准动作之前RemoveFiles和running synchronously——这样the EXE custom action thread需要在@之前完成987654343@ 可以继续(否则主线程可能会在您完成 EXE CA 之前卸载文件)。
我通常将 error processing 设置为 ignore exit code 用于卸载自定义操作(或者回滚可能会意外启动 - 通过撤消卸载将您的安装放回盒子上- 使安装程序不可卸载并且可能也不可升级 - 小升级应该仍然有效,但大升级可能会失败)。
此自定义操作是否会对系统进行更改? (而不是仅仅检查或记录一些东西)。然后它应该有一个相应的 rollback custom action,在序列中插入到您的主要自定义操作之前,如果手动中止设置,则撤消其更改(当您忽略退出代码时,CA 本身不应触发回滚,但设置仍然可以由用户手动取消,或由其他检查退出代码的 CA - 或与您的自定义操作无关的一些运行时故障 - 磁盘空间不足、磁盘错误等......)。
如果您制作 changes to per-machine locations(标准用户无法写入),您需要使用 elevated rights (deferred execution in system context) 运行。
这里有很多陷阱。请注意,可以通过策略或属性禁用回滚 - 导致回滚和提交自定义操作永远不会运行。我会在底部添加一些链接。
一些链接(非常好):
【讨论】:
CustomAction table 中 Orca 表格行的更新文本。您还需要在InstallExecuteSequence table 中添加一行,但我认为您已经有了。
Uninstall 并且卸载未完成并进入回滚?