修补程序排序

从 Windows Installer 3.0 开始,作者可以将修补程序排序信息添加到修补程序包数据库中的 MsiPatchSequence 表。 安装程序可以使用此信息来确定哪些修补程序适用于安装包、确定最佳修补顺序,并以独立于向系统提供修补程序的顺序的固定顺序安装修补程序。

Windows Installer 2.0:不支持。 Windows Installer 3.0 之前的 Windows Installer 版本按照向系统提供修补程序的顺序安装修补程序,而无论它们是否包含 MsiPatchSequence 表。

要使用修补程序排序功能,需要满足以下条件。

  • 修补程序包(.msp 文件)必须具有包含排序信息的 MsiPatchSequence 表。 对于没有 MsiPatchSequence 表的修补程序,安装程序按照其向系统的提供顺序来进行安装。
  • 使用 Windows Installer 3.0 或更高版本来安装修补程序。

Windows Installer 版本 3.0 具有以下功能,应用程序可以使用这些功能来确定最佳修补顺序。

  • MsiDeterminePatchSequence 函数获取修补程序列表,并确定可以按什么顺序将其应用于已安装的产品。 此函数考虑了系统上已安装的任何修补程序或产品。
  • MsiDetermineApplicablePatches 函数获取修补程序列表,并确定可以按什么顺序将其应用于已安装的产品。 此函数不考虑系统上已安装的任何修补程序或产品。

Windows Installer 版本 3.0 可以在单个修补安装中将多个修补程序应用于一个产品。 修补程序组中的修补程序可以包含修补排序信息 (MsiPatchSequence 表),也可以不包含该信息。 对于没有此表的修补程序包,Windows Installer 按照其向系统的提供顺序进行安装。 安装程序会考虑缺少 MsiPatchSequence 表但已通过下部分中所述的方法标记为已过时或被取代的修补程序的修补程序包。

当 Windows Installer 版本 3.0 安装多个修补程序时,它会按照以下步骤确定将各个修补程序应用于产品的顺序:

  1. 不包含 MsiPatchSequence 表的已安装修补程序按其应用于产品的顺序在序列中排序。 应用的第一个修补程序排在序列中的第一位。

  2. 没有 MsiPatchSequence 表 的新修补程序会放置在序列中。 当前修补安装将应用这些修补程序。 它们按照将其提供给系统的顺序放置,并放置在步骤 1 中的所有修补程序之后。

  3. 已过时的修补程序会从修补程序序列中移除。

    注意

    修补程序包可以在修订号摘要属性中指定要由修补程序移除的过时修补程序的明确列表。 此列表适用于版本 3.0 之前的 Windows Installer 版本。 仅当修补程序没有 MsiPatchSequence 表时,Windows Installer 版本 3.0 才会从序列中移除标记为已过时的修补程序。

     

  4. 安装程序逐步完成修补序列,并确定在给定序列中适用的修补程序。 将多个修补程序应用于产品时,序列中的每个修补程序还会转换产品的安装数据库(.msi 文件)。 仅当修补程序的数据库转换能够采用将上述所有修补程序包的转换应用于产品数据库而产生的产品代码版本语言升级代码时,该修补程序才在特定序列中适用。 安装程序会从序列中移除任何不适用的修补程序。

  5. 安装程序开始放置其 MsiPatchSequence 表中包含排序信息的修补程序。 具有 MsiPatchSequence 表的次要升级修补程序放在序列中已通过先前步骤排序的修补程序之后,并按照升级后的产品版本从最低到最高的顺序排列。 然后,Windows Installer 会移除此序列中不适用的所有次要升级修补程序。

  6. 面向次要升级且具有 MsiPatchSequence 表的小型更新修补程序被分配给序列中最高版本的次要升级修补程序。

  7. 在执行前面的步骤之后仍未分配且具有 MsiPatchSequence 表的所有小型更新修补程序放在序列中具有 MsiPatchSequence 表的第一个次要升级之前,以及 .msi 安装数据库和任何没有 MsiPatchSequence 表的修补程序之后。 然后,Windows Installer 会移除此序列中不适用的所有小型更新修补程序。

  8. Windows Installer 3.0 版会从序列中移除被取代的修补程序。 当某个修补程序取代了修补程序序列中较早出现的修补程序时,该修补程序包含较早修补程序中的所有修复。 不再需要以前的修补程序。 Windows Installer 需要 MsiPatchSequence 表中的信息,以移除被取代的修补程序。

    注意

    必须编写旨在取代早期修补程序集的修补程序,以取代所有修补程序系列中的早期修补程序。 小型更新修补程序只能取代小型更新。 次要升级可以取代小型更新和其他次要升级。

     

  9. MsiPatchSequence 表的小型更新修补程序根据其 MsiPatchSequence 表中的排序信息在产品版本中排序。 这决定了最终的修补顺序。

可以从修补序列中移除不应再使用的修补程序。 有关如何从修补序列中移除修补程序的详细信息,请参阅移除修补程序

有关如何使用 MsiPatchSequence 表按照修补程序的创作顺序应用修补程序的示例,请参阅多个修补示例