基于InstallShield 2018的InstallScript CA注册表修改卸载未清除,是否符合预期?
这个现象是正常的,原因和解决方法如下
咱们先拆解一下问题的核心:你的InstallScript自定义操作(CA)之所以在卸载时没执行注册表清理,完全是因为你设置的执行条件和放置的序列位置导致的,属于预期内的行为。
为什么卸载时CA不运行?
你的CA条件设为NOT REMOVE="ALL",而在MSI的卸载流程中,REMOVE属性的值会被自动设为"ALL"(表示要卸载所有产品组件)。这就意味着,卸载时这个条件不成立,你的CA根本不会被触发执行——代码都没跑,自然不会清理注册表。
另外,你把CA放在InstallInitialize和CostFinalize之间,这个序列段属于安装前的初始化阶段,卸载流程中这个阶段的操作逻辑和安装时差异很大,就算条件改了,这个位置也未必适合执行卸载清理操作。
怎么解决注册表卸载的问题?
如果必须用CA来处理注册表,你可以按以下方式调整配置:
- 方案1:调整现有CA的条件与逻辑:把条件改成覆盖安装和卸载场景的
NOT REMOVE="ALL" OR REMOVE="ALL",同时在CA代码里判断当前是安装还是卸载状态(通过读取REMOVE属性的值),分别执行写入或清理注册表的逻辑。 - 方案2:单独创建卸载专用CA:复制一份CA,专门用于卸载时清理注册表,把它放在卸载序列里合适的位置(比如
InstallValidate之后、InstallInitialize之前,或者RemoveFiles之后),条件设为REMOVE="ALL"。
额外的最佳实践提醒
虽然你说受限于条件只能用CA,但还是要提一句:MSI本身提供了组件级的注册表管理功能——把注册表项绑定到组件上,MSI会自动在卸载时清理这些注册表项,比用CA可靠得多,也避免了序列和条件配置出错的问题。如果后续有机会,建议尽量迁移到这种方式。
内容的提问来源于stack exchange,提问作者Epligam
相关产品推荐
相关产品推荐

