防止出现修补程序需要访问原始安装源的情况

在应用修补程序时,无法完全避免需要访问原始安装源的情况。

遵循以下几点做法,以尽量减少修补程序需要访问原始源的可能性:

  • 使用仅限整个文件的修补程序。 这样就无需为所有以前发布的文件版本创建二进制修补程序。 请注意,整文件修补程序的大小通常比二进制修补程序要大。 通过在修补程序创建属性 (PCP) 文件中创建值为 1(一)的 IncludeWholeFilesOnly 属性,可以轻松将修补程序设置为整文件修补程序。
  • 确保没有任何自定义操作访问原始源位置。
  • 确保 ResolveSource 操作是条件性的,使其仅按需运行,或者根本不要提供此操作。
  • 填充所有版本不受控文件的 MsiFileHash 表。 Windows Installer SDK 工具 Msifiler.exe 可以轻松为你完成此操作。
  • 确保所有文件具有正确的版本和语言信息。 Windows Installer SDK 工具 Msifiler.exe 可以轻松为你完成此操作。

修补时的源要求

对于以下情况,可能需要访问原始安装源才能应用修补程序:

  • 该修补程序应用于当前从源运行的功能。 在这种情况下,该功能将从“从源运行”状态转换为本地状态。

  • 该修补程序应用于文件缺失或损坏的组件。

  • 该修补程序应用于组件中的某个文件,而该组件还包含没有 MsiFileHash 条目的版本不受控文件。 需要通过一个已填充的 MsiFileHash 表来防止从源位置不必要地重新复制版本不受控的文件。

  • 该修补程序是使用 REINSTALLMODE 值 amus 或 emus 应用的。 此选项会带来风险,因为不管文件版本如何,它都会执行文件复制操作。 这可能会导致文件版本降级,并且几乎始终需要访问源。 建议的 REINSTALLMODE 值为 omus。

  • 缺少产品的缓存包。 应用修补程序需要缓存包。 缓存包存储在 %windir%\Installer 文件夹中。

  • 该包旨在用于调用 ResolveSource 操作。 通常应避免此操作,或者应该为其设置适当的条件,因为执行此操作始终需要访问源。

  • 该包中的一个自定义操作会尝试以某种方式访问源。 最常见的示例是类型 23 并发安装自定义操作。

    注意

    对于打算向公众发布的应用程序的安装,建议不要使用并发安装。 有关并发安装的信息,请参阅并发安装

     

  • 修补程序包包含不应用于计算机上当前文件版本的二进制修补程序。

考虑以下示例,其中 Windows Installer 在应用修补程序时需要访问原始源:

  1. 安装产品 RTM 版本示例。
  2. 将修补程序 Qfe1.msp 应用于计算机。 这会将 Example.dll 版本 1.0 修补为版本 1.1。
  3. 提供新修补程序 Qfe2.msp,它将 Example.dll 更新为版本 1.2,并废弃 Qfe1.msp。 但是,该修补程序是仅针对 Example.dll 版本 1.0 创建的,因为它是使用该产品的 RTM 版本生成的。 Example.dll 版本 1.2 包含 Example.dll 版本 1.1 中的修复,但 .msp 文件是在 RTM 和 QFE2 映像之间生成的。 因此,将 Qfe2.msp 应用于计算机时,Windows Installer 需要访问原始源。 Example.dll 的二进制修补程序不能应用于版本 1.1;它只能应用于版本 1.0。 这会导致安装程序从原始源位置重新复制 Example.dll 版本 1.0,以便可以成功应用修补程序。

删除修补程序时的源要求

如果 Windows Installer 未存储有关修补程序的基线信息,则可能需要访问原始安装源才能删除该修补程序。 从 Windows Installer 3.0 开始,安装程序在更新文件时选择性地保存有关文件的基线信息。 有关基线缓存的详细信息,请参阅减小修补程序大小