并发安装

并发安装(也称为嵌套安装)是 Windows Installer 的一项已弃用功能。 使用并发安装安装的应用程序最终可能会失败,因为客户难以正确维护这些应用程序。 请勿使用并发安装来安装打算向公众发布的产品。 当用于安装不打算公开发布的应用程序时,并发安装在受控的公司环境中的适用性有限。 并发安装文档是为希望将并发安装用于不公开分发的应用程序的包作者提供的。

并发安装操作在当前正在运行的安装过程中安装另一个 Windows Installer 包。 通过将并发安装操作创作到 CustomAction 表中并将此自定义操作安排到序列表中,将并发安装添加到包中。 CustomAction 表的“目标”字段包含并发安装使用的公共属性设置字符串。 CustomAction 表的“源”字段标识并发包。 并发安装操作只能重新安装或删除由当前应用程序的安装包安装的应用程序。

并发安装操作的类型在 CustomAction 表的“类型”字段中指定。 根据自定义操作类型,并发应用程序的包可以驻留在主包的子存储中,作为属性指定位置的文件,或作为用户计算机上的播发应用程序。 以下类型的自定义操作执行并发安装。

自定义操作类型 说明
自定义操作类型 7 驻留在安装包中的产品的并发安装。
自定义操作类型 23 当前源树中的安装包的并发安装。
自定义操作类型 39 播发安装包的并发安装。

 

并发安装与主安装共享相同的用户界面和日志记录设置。

并发安装操作应放置在主安装操作序列的 InstallInitialize 操作InstallFinalize 操作之间。 回滚主安装后,安装程序也会回滚并发安装。 不需要将延迟执行与并发安装操作一起使用,因为安装程序会合并来自并发安装和主安装的回滚信息。 回滚安装后,所有更改都会撤消。

并发安装操作的返回值与其他自定义操作的返回值相同。 请参阅自定义操作返回值

指定系统自动重启或请求用户重启的标准或自定义操作也可以从并发安装中执行重启或请求。

安装程序开始并发安装后,它会锁定所有其他安装,直到并发安装完成,然后继续主安装。 安装程序只能将并发安装作为同步自定义操作执行。 请参阅同步和异步自定义操作自定义操作返回处理选项中描述的选项标志必须设置为 none (+0) 或 msidbCustomActionTypeContinue (+64)。

并发安装操作可以安装要在本地运行、从源运行、重新安装或删除的应用程序,其方式与使用 MsiInstallProduct 进行常规安装时的方式相同。 若要指定安装类型,请将 ADDLOCALADDSOURCEREINSTALLREMOVE 属性传递给并发安装操作。

并发安装操作可以成对创作,一个操作用于安装,另一个操作用于删除并发安装。 自定义操作类型 7自定义操作类型 23 通常用于安装。 自定义操作类型 39 通常用于在卸载父产品时删除并发安装。 CustomAction 表中用于删除自定义操作的记录可以在“源”字段中包含产品代码 GUID,在“目标”字段中包含“REMOVE=ALL”。 这两个自定义操作需要在具有互斥条件的操作序列表中创作。 例如,安装产品的自定义操作可以在其“条件”字段中包含“NOT Installed”,而删除并发安装的自定义操作可以在其“条件”字段中包含 REMOVE=“ALL”。

没有查询包成本的方法。 这使得并发安装的成本计算变得困难。 必须将行添加到 ReserveCost 表,以指示与并发安装关联的组件的文件夹和最坏情况的成本。

并发安装操作中唯一可用的自定义操作返回处理选项为 none (+0) 或 msidbCustomActionTypeContinue (+64)。

请注意,父安装不能将自己的包作为并发安装操作调用。

请注意,如果按计算机安装尝试运行按用户并发安装,则安装程序默认将父安装注册为按用户。 这可能会导致安装程序错误地删除应用程序,因为安装程序会在按计算机应用程序实际注册为按用户时尝试将其卸载。 若要强制显示并发安装的状态以跟踪其父安装的状态,请在 CustomAction 表的 Target 列中输入 ALLUSERS=“[ALLUSERS]”。 在这种情况下,如果父级是按计算机,则并发安装是按计算机;如果父级是按用户,则并发安装是按用户。

开发人员在创作并发安装时应注意以下警告。

  • 并发安装不应共享组件。
  • 管理安装也不能包含并发安装。
  • 修补和升级可能无法与并发安装配合进行。
  • 安装程序可能无法正常进行并发安装。
  • 不能将集成的 ProgressBar 与并发安装配合使用。
  • 要播发的资源无法通过并发安装来安装。
  • 执行应用程序并发安装的包还应在卸载父产品时卸载并发应用程序。

若要防止将包作为并发安装进行安装,请将以下任一条件语句添加到 LaunchCondition 表中。 这可以防止由另一个安装运行的并发安装操作安装包。 这不会阻止 RemoveExistingProducts 操作删除包。 另请参阅 ParentOriginalDatabase 属性和 ParentProductCode 属性。

"Not ParentProductCode"
"Not ParentOriginalDatabase"