并发安装
并发安装(也称为嵌套安装)是 Windows Installer 的弃用功能。 使用并发安装安装安装的应用程序最终可能会失败,因为客户难以正确提供服务。 不要使用并发安装来安装旨在向公众发布的产品。 当用于安装不适合公开发布的应用程序时,并发安装可以在受控的公司环境中具有有限的适用性。 为希望将并发安装用于非公共分发的应用程序的包作者提供了并发安装文档。
并发安装作在当前正在运行的安装过程中安装另一个 Windows Installer 包。 通过将并发安装作创作到 CustomAction 表 并将此自定义作安排到序列表中,从而将并发安装添加到包中。 CustomAction 表的目标字段包含并发安装使用的公共属性设置字符串。 CustomAction 表的“源”字段标识并发包。 并发安装作只能重新安装或删除当前应用程序的安装包安装的应用程序。
并发安装作的类型在 CustomAction 表的 Type 字段中指定。 根据自定义作类型,并发应用程序的包可以驻留在主包的子存储中、作为属性指定的位置的文件,或作为用户计算机上的播发应用程序。 以下类型的自定义作执行并发安装。
自定义作类型 | 描述 |
---|---|
自定义作类型 7 | 驻留在安装包中的产品的并发安装。 |
自定义作类型 23 | 当前源树中安装程序包的并发安装。 |
自定义作类型 39 | 播发的安装程序包的并发安装。 |
并发安装与主安装共享相同的用户界面和日志记录设置。
并发安装作应放置在主安装作序列的 InstallInitialize作 和 InstallFinalize作 之间。 在主安装回滚后,安装程序也会回滚并发安装。 由于安装程序将并发安装中的回滚信息合并在一起,因此不需要使用 延迟执行 和并发安装作。 回滚安装后,将撤消所有更改。
并发安装作的返回值与其他自定义作的返回值相同。 请参阅 自定义作返回值。
指定自动重启系统或请求用户重启的标准或自定义作也可以从并发安装中执行重启或请求。
安装程序开始并发安装后,它会锁定所有其他安装,直到并发安装完成,然后再继续主安装。 安装程序只能将并发安装作为同步自定义作执行。 请参阅 同步和异步自定义作。 自定义作返回处理选项中所述的选项标志 必须设置为 none (+0) 或 msidbCustomActionTypeContinue (+64)。
并发安装作可以安装要在本地运行、从源运行、重新安装或以与使用 MsiInstallProduct 进行常规安装时相同的方式删除应用程序。 若要指定安装类型,请将 ADDLOCAL、ADDSOURCE、REINSTALL或 REMOVE 属性传递给并发安装作。
并发安装作可以成对创作,一个作用于安装,另一个作用于删除并发安装。 自定义作类型 7 或 自定义作类型 23 通常用于安装。 自定义作类型 39 通常用于在卸载父产品时删除并发安装。 CustomAction 表中删除自定义作的记录 可以在“源”字段中具有“删除”和“目标”字段中的“REMOVE=ALL”的代码示例 GUID。 需要用互斥条件在作序列表中创作这两个自定义作。 例如,安装产品的自定义作在其“条件”字段中可以有“未安装”,自定义作删除并发安装可以在其“条件”字段中具有 REMOVE=“ALL”。
没有用于查询包的成本的方法。 这使得并发安装的成本变得困难。 必须将行添加到 ReserveCost 表,以指示与并发安装关联的组件的文件夹和最坏情况成本。
并发安装作 可用的自定义作返回处理选项的唯一 无(+0)或 msidbCustomActionTypeContinue (+64)。
请注意,父安装无法将其自己的包称为并发安装作。
请注意,如果每台计算机安装尝试运行每用户并发安装,则安装程序默认将父安装注册为按用户。 这可能会导致安装程序错误地删除应用程序,因为安装程序在实际注册为每个用户时会尝试卸载每个计算机的应用程序。 若要强制并发安装的状态跟踪其父安装的状态,请在 CustomAction 表的目标列中输入 ALLUSERS=“[ALLUSERS]”。 在这种情况下,如果父级是每台计算机,则并发安装是每台计算机,如果父级是每个用户,则并发安装是按用户。
在创作并发安装时,开发人员应注意以下警告。
- 并发安装无法共享组件。
- 管理安装也不能包含并发安装。
- 修补和升级不适用于并发安装。
- 安装程序可能无法正确花费并发安装费用。
- 集成 ProgressBar 不能与并发安装一起使用。
- 并发安装无法安装要播发的资源。
- 执行应用程序并发安装的包还应在卸载父产品时卸载并发应用程序。
若要防止将包作为并发安装进行安装,请将以下任一条件语句添加到 LaunchCondition 表。 这样可以防止由另一个安装运行的并发安装作安装包。 这不会阻止 RemoveExistingProducts作删除包。 另请参阅 ParentOriginalDatabase 属性和 ParentProductCode 属性。
"Not ParentProductCode"
"Not ParentOriginalDatabase"