VSPackage 安装方案

设计 VSPackage 安装程序具有灵活性非常重要。 例如,可能需要将来发布安全修补程序,或者可能会更改需要全面并行版本控制支持的业务策略。

支持多个版本的 Visual Studio 中,可以使用 VSPackage 的共享安装或并行安装来了解支持 Visual Studio 并行安装的优点和问题。 简言之,并行 VSPackage 可让你最灵活地支持 Visual Studio 的新功能。

本主题中讨论的方案不仅是你唯一的选择,而是显示为建议的最佳做法。

组件、隐私和共享

使组件独立

识别并填充组件、分配 GUID组件和部署组件后,无法更改其组合。 如果确实更改组件的组合,生成的组件必须是具有新 GUID组件的新组件。 鉴于这些事实,通过使每个组件独立、自力更生的单元,提供了最大的版本控制灵活性。 有关控制组件的规则的详细信息,请参阅更改组件代码;如果组件规则已损坏,会发生什么情况?

不要在组件中混合共享和专用资源

引用计数发生在组件级别。 因此,在一个组件中混合共享和专用资源使得无法更新专用资源(如可执行文件),而无需覆盖共享资源。 此方案会创建向后兼容性问题,并限制你创建并行功能。

例如,用于向 Visual Studio SDK 注册 VSPackage 的注册表值应与用于向 Visual Studio 注册 VSPackage 的组件分开。 共享文件或注册表值将进入另一个组件。

方案 1:共享 VSPackage

在此方案中,共享的 VSPackage(支持多个版本的 Visual Studio 的单个二进制文件)在 Windows Installer 包中提供。 注册每个版本的 Visual Studio 由用户可选择的功能控制。 这也意味着,当分配给单独的功能时,可以单独选择每个组件进行安装或卸载,使用户能够控制将 VSPackage 集成到不同版本的 Visual Studio 中。 (请参阅 有关在 Windows Installer 包中使用功能的详细信息,请参阅 Windows Installer 功能

VS Shared VSPackage installer

如图所示,共享组件是始终安装的Feat_Common功能的一部分。 通过使Feat_VS2002和Feat_VS2003功能可见,用户可以在安装时选择希望 VSPackage 集成的 Visual Studio 版本。 用户还可以使用 Windows Installer 维护模式添加或删除功能,在这种情况下,它添加或删除不同版本的 Visual Studio 中的 VSPackage 注册信息。

注意

将功能的“显示”列设置为 0 可隐藏它。 低级别列值(如 1)可确保始终安装它。 有关详细信息,请参阅 INSTALLLEVEL 属性功能表

方案 2:共享 VSPackage 更新

在此方案中,已提供方案 1 中 VSPackage 安装程序的更新版本。 为了讨论,更新添加了对 Visual Studio 的支持,但它也可能是更简单的安全修补程序或 bug 修复 Service Pack。 Windows Installer 用于安装较新的组件的规则要求系统上已有未更改的组件不会重新编译。 在这种情况下,已有版本 1.0 的系统将覆盖更新的组件 Comp_MyVSPackage.dll,让用户选择使用其组件Comp_VS2005_Reg添加新功能Feat_VS2005。

注意

每当在多个版本的 Visual Studio 之间共享 VSPackage 时,VSPackage 的后续版本必须保持与早期版本的 Visual Studio 的向后兼容性。 如果无法保持向后兼容性,则必须使用并行专用 VSPackage。 有关详细信息,请参阅 支持多个版本的 Visual Studio

VS Shared VS Package Update installer

此方案提供新的 VSPackage 安装程序,利用 Windows Installer 对次要升级的支持。 用户只需安装版本 1.1,即可升级版本 1.0。 但是,不需要在系统上具有版本 1.0。 同一安装程序将在没有版本 1.0 的系统上安装版本 1.1。 以这种方式提供次要升级的优点是,无需完成开发升级安装程序和完整产品安装程序的工作。 一个安装程序执行这两个作业。 安全修补程序或 Service Pack 可能会改用 Windows Installer 修补程序。 有关详细信息,请参阅 修补和升级

方案 3:并行 VSPackage

此方案提供两个 VSPackage 安装程序-一个用于每个版本的 Visual Studio .NET 2003 和 Visual Studio。 每个安装程序都并行安装 VSPackage 或专用 VSPackage(专为特定版本的 Visual Studio 构建和安装)。 每个 VSPackage 都位于其自己的组件中。 因此,可以使用修补程序或维护版本单独为每个服务。 由于 VSPackage DLL 现在特定于版本,因此可以安全地将其注册信息包含在 DLL 所在的同一组件中。

VS Side-by-Side VS Package installer

每个安装程序还包括两个安装程序之间共享的代码。 如果将共享代码安装到通用位置,则安装这两个 .msi 文件将仅安装一次共享代码。 第二个安装程序只会递增组件的引用计数。 引用计数可确保如果卸载其中一个 VSPackage,则共享代码将保留给另一个 VSPackage。 如果同时卸载第二个 VSPackage,则会删除共享代码。

方案 4:并行 VSPackage 更新

在此方案中,适用于 Visual Studio 的 VSPackage 存在安全漏洞,需要发出更新。 与方案 2 一样,可以创建一个新的 .msi 文件,用于更新现有安装以包含安全修补程序,以及部署具有已就地安全修补程序的新安装。

在这种情况下,VSPackage 是在全局程序集缓存(GAC)中安装的托管 VSPackage。 重新生成它以包含安全修补程序时,必须更改程序集版本号的修订号部分。 新程序集版本号的注册信息将覆盖以前的版本,从而导致 Visual Studio 加载固定程序集。

VS Side-by-Side VS Package Update installer

有关并行程序集部署的详细信息,请参阅 使用 .NET Framework 简化部署和解决 DLL 地狱。