更新程序集

本主题中的信息确定了使用 Windows Installer 修补程序更新程序集的建议准则。

程序集更新的作者可以使用以下适用于所有类型程序集的准则:

  • 更新程序集时,建议方法是在 MsiAssemblyName 表中更改程序集的强名称。 新程序集版本可由新组件提供,也可以由提供旧版本的同一组件提供。
  • 如果新程序集版本由同一组件提供,请不要将程序集类型从 .NET Framework 程序集更改为 Win32 程序集,反之亦然。
  • 如果系统上的所有应用程序都必须使用更新的程序集,则应部署策略程序集。 策略程序集可以重定向系统上的应用程序以使用新的程序集版本。 应通过创建新组件来提供策略程序集。
  • 需要 Windows Installer 3.0 或更高版本才能卸载程序集更新。 有关详细信息,请参阅移除修补程序
  • 较新版本的程序集应包含以前发布的程序集中相同或更高版本的文件。
  • 可以通过完整文件替换或较小的增量更新,Windows Installer 3.0 可以为 .NET Framework 和 Win32 程序集提供服务。 有关详细信息,请参阅减小修补程序大小
  • 如果更新更改了程序集的强名称,则如果修补程序包没有 MsiPatchSequence 表,则需要 MsiPatchOldAssemblyFile 表MsiPatchOldAssemblyName 表。 如果修补程序包在 MsiPatchSequence 表中包含修补程序排序信息,则不需要 MsiPatchOldAssemblyFile 表和 MsiPatchOldAssemblyName 表。
  • 在发布新修补程序之前,请将修补程序与以前发布的所有修补程序一起应用,从而对其进行测试。

更新 Win32 程序集

在更新 Win32 程序集时请遵循以下准则:

  • 更改 MsiAssemblyName 表中指定的新程序集的强名称。
  • 如果希望应用程序始终使用新版本的程序集,而不会影响系统上其他应用程序使用的程序集版本,请使用同一组件来包含用于旧程序集版本的新程序集版本。 在 Component 表中保留相同的 ComponentId。 修补应用程序后,仅保留对新版本程序集的引用。 旧版本的程序集可以保留在全局程序集缓存中的新版本中。 这不会影响系统上使用旧版本程序集的其他应用程序。 如果程序集的新旧版本使用了相同组件时,更新可以是较小的增量修补程序。
  • 如果新版本的程序集与要安装应用程序的所有系统不兼容,则可以将程序集的新版本和旧版本作为并行程序集安装。 若要并行安装这两个程序集版本,请创建一个新组件以包含新的程序集版本。 新组件的 Component 表中的 ComponentId 应不同于具有旧版本的组件的 ComponentId。 修补应用程序后,应用程序会保留对两个程序集版本的引用。 然后,可以通过清单将应用程序定向到程序集的兼容版本。 如果程序集的新旧版本使用了不同组件时,更新将使用完整的文件替换。

更新 .NET Framework 程序集

更新 .NET Framework 程序集时,请遵循以下准则。

  • 更改 MsiAssemblyName 表中指定的新程序集的强名称。

  • 如果希望应用程序始终使用新版本的程序集,而不会影响系统上其他应用程序使用的程序集版本,请更改 MsiAssemblyName 表中指定的新程序集的强名称,并使用同一组件来包含用于旧程序集版本的新程序集版本。 在 Component 表中保留相同的 ComponentId。 修补应用程序后,仅保留对新版本程序集的引用。 旧版本的程序集可以保留在全局缓存中的新版本中。 这不会影响系统上使用旧版本程序集的其他应用程序。 如果程序集的新旧版本使用了相同组件时,更新可以是较小的增量修补程序。

  • 如果新版本的程序集与要安装应用程序的所有系统不兼容,则可以将程序集的新版本和旧版本作为并行程序集安装。 要并行安装这两个程序集版本,请更改 MsiAssemblyName 表中指定的新程序集的强名称,并创建一个新组件以包含新的程序集版本。 新组件的 Component 表中的 ComponentId 应不同于具有旧版本的组件的 ComponentId。 修补应用程序后,应用程序会保留对两个程序集版本的引用。 然后,可以通过清单将应用程序定向到程序集的兼容版本。 如果程序集的新旧版本使用了不同组件时,更新将使用完整的文件替换。

  • 就地更新会覆盖全局程序集缓存中 .NET Framework 程序集的副本。 此类型的程序集更新不会更改程序集的强名称。 只有 MsiAssemblyName 表的 FileVersion 字段中的值会更改。 .NET Framework 程序集的就地更新需要 .NET Framework 1.1 SP1 或更高版本。

    注意

    就地更新类型会覆盖全局缓存中程序集的副本,如果新版本的程序集不完全向后兼容,可能会中断其他应用程序。 更新程序集时,建议方法是在 MsiAssemblyName 表中更改程序集的强名称。