我在this一书中提到了以下建议,
如果您在InstallInitialize之后安排RemoveExistingProducts,那么 还必须安排InstallExecute操作在其后运行。
这是在重大升级的背景下。但作者并没有详细说明为什么必须这样做。背后的原因是什么?
答案 0 :(得分:0)
RemoveExistingProducts的MSDN文档说明了你必须做的事情,这是一个原因。它指出InstallExecute的常用顺序是InstallExecute,RemoveExistingProducts和InstallFinalize。否则REP需要在系统发生任何实际更改之前发生,这就是为什么在InstallInitialize或InstallValidate之后立即是合法的序列选择,这是关于"之前更为模糊的规则改变系统的脚本动作"。
另一个原因是InstallExecute确保安装事务已完成,因此当新安装的升级未完全完成且REP在InstallFinalize之前时,您不会卸载旧产品。
https://msdn.microsoft.com/en-us/library/windows/desktop/aa369502(v=vs.85).aspx
总而言之,REP需要在对系统进行任何操作之前进行排序,或者在事务中使用InstallExecute提交所有必需的更改之后进行排序。此外,如果它在交易中,那么它将包含在回滚中,这将重新安装正在升级的旧产品。 InstallFinalize之后的REP意味着卸载可能会失败并回滚,重新安装产品会导致系统上的旧产品和新产品。
您引用的文档"在InstallInitialize"之后没有充分涵盖所有可能性,因为在InstallFinalize之后并不意味着需要InstallExecute。它可能已脱离上下文,但MSDN文档相当完整。