管理并行文件关联

如果 VSPackage 提供文件关联,则必须决定如何处理应调用特定版本的 Visual Studio 来打开文件的并行安装。 不兼容的文件格式使问题复杂化。

用户期望新版本的产品与早期版本兼容,以便可以在新版本中加载现有文件,而不会丢失数据。 理想情况下,VSPackage 可以加载和保存早期版本的文件格式。 如果不是真的,则应提供将文件格式升级到 VSPackage 的新版本。 此方法的缺点是升级后的文件无法在早期版本中打开。

若要避免此问题,可以在文件格式不兼容时更改扩展。 例如,VSPackage 版本 1 可以使用扩展名 .mypkg10,版本 2 可以使用扩展名 .mypkg20。 此差异标识打开特定文件的 VSPackage。 如果将较新的 VSPackage 添加到与旧扩展关联的程序列表中,用户可以右键单击该文件并选择在较新的 VSPackage 中打开它。 此时,VSPackage 可以提供将文件升级到新格式或打开该文件,并保持与早期版本的 VSPackage 的兼容性。

注意

可以合并这些方法。 例如,可以通过加载较旧的文件并提供在用户保存文件时升级文件格式来提供向后兼容性。

面对问题

如果希望多个并行 VSPackage 使用相同的扩展,则必须选择与扩展关联的 Visual Studio 版本。 下面是两种替代方法:

  • 在用户计算机上安装的最新版本的 Visual Studio 中打开该文件。

    在此方法中,安装程序负责确定最新版本的 Visual Studio,并将其包含在为文件关联编写的注册表项中。 在 Windows Installer 包中,可以包含自定义操作来设置指示 Visual Studio 最新版本的属性。

    注意

    在此上下文中,“latest”表示“最新支持的版本”。这些安装程序条目不会自动检测 Visual Studio 的后续版本。 检测系统要求和安装后必须运行的命令中的条目类似于此处介绍的条目,并且需要支持其他版本的 Visual Studio。

    CustomAction 表中的以下行将 DEVENV_EXE_LATEST 属性设置为 AppSearch 和 RegLocator 表中讨论 的属性,这些属性必须在安装后运行。 InstallExecuteSequence 表中的行在执行序列的早期计划自定义操作。 条件列中的值使逻辑正常工作:

    • 如果 Visual Studio .NET 2002 是唯一的当前版本,则为最新版本。

    • 仅当 Visual Studio .NET 2003 存在且 Visual Studio 不存在时,才是最新版本。

    • 如果 Visual Studio 是唯一的当前版本,则 Visual Studio 是最新版本。

      净结果是,DEVENV_EXE_LATEST包含最新版本 devenv.exe 的路径。

    确定最新版本的 Visual Studio 的 CustomAction 表行

    操作 类型 Source 目标
    CA_SetDevenvLatest_2002 51 DEVENV_EXE_LATEST [DEVENV_EXE_2002]
    CA_SetDevenvLatest_2003 51 DEVENV_EXE_LATEST [DEVENV_EXE_2003]
    CA_SetDevenvLatest_2005 51 DEVENV_EXE_LATEST [DEVENV_EXE_2005]

    InstallExecuteSequence 表行,用于确定最新版本的 Visual Studio

    操作 条件 序列
    CA_SetDevenvLatest_2002 DEVENV_EXE_2002 AND NOT(DEVENV_EXE_2003或DEVENV_EXE_2005) 410
    CA_SetDevenvLatest_2003 DEVENV_EXE_2003 AND NOT DEVENV_EXE_2005 420
    CA_SetDevenvLatest_2005 DEVENV_EXE_2005 430

    可以使用 Windows Installer 包注册表表中的 DEVENV_EXE_LATEST 属性来写入 HKEY_CLAS标准版S_ROOTProgIdShellOpenCommand 键的默认值 [DEVENV_EXE_LATEST] “%1”

  • 运行可从可用 VSPackage 版本做出最佳选择的共享启动器程序。

    Visual Studio 的开发人员选择了此方法来处理由许多版本的 Visual Studio 生成的多种解决方案和项目的复杂要求。 在此方法中,将启动器程序注册为扩展处理程序。 启动器检查文件,并确定 Visual Studio 和 VSPackage 的哪个版本可以处理该特定文件。 例如,如果用户打开上次由特定版本的 VSPackage 保存的文件,启动器可以在匹配的 Visual Studio 版本中启动 VSPackage。 此外,用户可以将启动器配置为始终启动最新版本。 启动器还可以提示用户升级文件格式。 如果文件格式包含版本号,启动器可能会通知用户,如果文件格式来自高于一个或多个已安装的 VSPackage 的版本。

    启动器应位于与 VSPackage 的所有版本共享的 Windows Installer 组件中。 此过程可确保始终安装最新版本,并且不会在卸载 VSPackage 的所有版本之前删除。 这样,即使卸载了 VSPackage 的一个版本,启动器组件的文件关联和其他注册表项也会保留。

卸载和文件关联

卸载为文件关联写入注册表项的 VSPackage 会删除文件关联。 因此,扩展没有关联的程序。 Windows Installer 不会“恢复”安装 VSPackage 时添加的注册表项。 下面是修复用户文件关联的一些方法:

  • 如前所述使用共享启动器组件。

  • 指示用户运行 VSPackage 版本的修复,该用户希望拥有文件关联。

  • 提供一个单独的可执行程序,用于重写相应的注册表项。

  • 提供配置选项页或对话框,允许用户选择文件关联并回收丢失的关联。 指示用户在卸载后运行它。