我的MSI项目中有一个CustomAction,条件为 MsiPatchRemovalList ,这是因为我需要为每个补丁卸载过程执行此操作。
这是正常工作,当我执行卸载补丁时,它正在执行CustomAction并执行过程引用特定补丁而不会出错。
问题是当我卸载MSI时,所有补丁都被卸载但事件未被触发。
注意:在MSI卸载中执行不是一个选项,因为此事件需要针对每个补丁执行特定的过程
更新: 自定义操作过程是使MSIPATCHREMOVE元素知道Patch Guid并使用此guid创建一个注册密钥,在寄存器中具有历史记录以了解卸载了哪个补丁
答案 0 :(得分:2)
你应该能够拥有(MsiPatchRemovalList或REMOVE =“ALL”)的条件。
如果您需要知道在卸载产品时应用了哪些补丁,那么在我假设安装之前,您需要调用MsiEnumPatches(或等效产品)并执行诸如传递它们之类的操作在卸载命令行上:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa370099(v=vs.85).aspx
另一件事你可以为每个补丁添加一个包含(比如说)其补丁guid的注册表项,从而有效地制作你自己的列表。然后,您可以对每个可能的修补程序或列表执行注册表搜索,并设置类似于标准修补程序删除列表的属性。我没有想到这一点,但是如果每个补丁都给注册表添加一些内容,说“我在这里”你就不必非常依赖补丁删除列表,因为你已经创建了自己的补丁。