必须注册源代码管理 VSPackage 才能将其公开给 Visual Studio。 如果注册了多个源代码管理系统的 VSPackage,用户可以在适当时间选择加载哪个 VSPackage。 有关 VSPackage 以及如何注册 VSPackage 的详细信息,请参阅 VSPackages 。
注册源代码管理包
源代码管理包已注册,以便 Visual Studio 环境可以找到它并查询其支持的功能。 这符合延迟加载方案,即只有在包的功能或命令被需要或明确请求时才会创建包的实例。
VSPackages 在特定于版本的注册表项中放置信息,HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\X.Y,其中 X 是主版本号, Y 是次要版本号。 这种做法提供支持并行安装多个版本的 Visual Studio 的功能。
Visual Studio 用户界面(UI)支持从多个已安装的源代码管理插件(通过源代码管理适配器包)以及源代码管理 VSPackage 中进行选择。 一次只能有一个活动源代码管理插件或 VSPackage。 但是,如下所示,IDE 允许通过基于解决方案的自动包交换机制在源代码管理插件和 VSPackage 之间切换。 源代码管理 VSPackage 中存在一些要求,用于启用此选择机制。
注册表项
源代码管理包需要三个专用 GUID:
包 GUID:这是包含源代码管理实现的包的主要 GUID(在本部分中称为ID_Package)。
源代码管理 GUID:这是源代码管理 VSPackage 的 GUID,用于向 Visual Studio 源代码管理存根注册,也用作命令 UI 上下文 GUID。 源代码管理服务 GUID 在源代码管理 GUID 下注册。 在此示例中,源代码管理 GUID 称为ID_SccProvider。
源代码管理服务 GUID:这是 Visual Studio 使用的专用服务 GUID(在本部分中称为SID_SccPkgService)。 除此之外,源代码管理包还需要为 VSPackage、工具窗口等定义其他 GUID。
源代码管理 VSPackage 必须创建以下注册表项:
| 密钥名称 | Entries |
|---|---|
HKEY_LOCAL_MACHINE\ SOFTWARE\ Microsoft\ VisualStudio\ X.Y\ SourceControlProviders\ |
(default)= rg_sz:{ID_SccProvider} |
HKEY_LOCAL_MACHINE\ SOFTWARE\ Microsoft\ VisualStudio\ X.Y\ SourceControlProviders\ {ID_SccProvider}\ |
(default) = rg_sz:<包的友好名称> 服务 = rg_sz:{SID_SccPkgService} |
HKEY_LOCAL_MACHINE\ SOFTWARE\ Microsoft\ VisualStudio\ X.Y\ SourceControlProviders\ {ID_SccProvider}\ Name\ |
(默认值) = 本地化名称的 rg_sz:#<资源 ID> Package = rg_sz:{ID_Package} |
HKEY_LOCAL_MACHINE\ SOFTWARE\ Microsoft\ VisualStudio\ X.Y\ SolutionPersistence\ <PackageName>\请注意,键名称 SourceCodeControl已被 Visual Studio 占用,并不能作为<PackageName>的选项。 |
(默认) = rg_sz:{ID_Package} |
选择源代码管理包
可以同时注册多个基于源代码管理插件 API 的插件和源代码管理 VSPackage。 选择源代码管理插件或 VSPackage 的过程必须确保 Visual Studio 在适当的时候加载插件或 VSPackage,并可以延迟加载不必要的组件,直到需要这些组件。 此外,Visual Studio 必须从其他非活动 VSPackage 中删除所有 UI,包括菜单项、对话框和工具栏,并显示活动 VSPackage 的 UI。
执行以下任一操作时,Visual Studio 将加载源代码控件 VSPackage:
打开解决方案(解决方案在源代码管理下时)。
在打开受源代码管理的解决方案或项目时,IDE 会触发加载为该解决方案指定的源代码管理 VSPackage。
执行源代码管理 VSPackage 的任何菜单命令。
源代码管理的 VSPackage 应仅在需要时加载任何必需的组件(这称为延迟加载)。
基于解决方案的自动 VSPackage 交换
可以通过 Visual Studio 选项 对话框的 源代码控制 类别下手动交换 VSPackage。 基于解决方案的自动交换意味着为特定解决方案指定的源代码管理包在打开该解决方案时会自动设置为活动。 每个源代码管理包都应实现 SetActive 和 SetInactive。 Visual Studio 处理源代码管理插件(实现源代码管理插件 API)和源代码管理 VSPackage 之间的切换。
源代码控制适配器包用于切换到任何基于源代码控制插件API的插件。 切换到中间源代码管理适配器包并确定哪些源代码管理插件必须设置为活动或非活动状态的过程对用户是透明的。 当任何源代码管理插件处于活动状态时,适配器包始终处于活动状态。 在两个源代码管理插件之间进行切换相当于直接加载和卸载插件 DLL。 但是,切换到源代码管理 VSPackage 涉及与 IDE 交互以加载相应的 VSPackage。
当打开任何解决方案且该解决方案文件中包含 VSPackage 的注册表项时,将调用源代码管理 VSPackage。 打开解决方案后,Visual Studio 将找到注册表值并加载相应的源代码管理 VSPackage。 所有源代码管理 VSPackage 都必须具有上述注册表项。 在源代码管理下的解决方案被标记为与特定源代码管理 VSPackage 相关联。 源代码控制 VSPackage 必须实现 IVsSolutionPersistence,以启用自动的基于解决方案的 VSPackage 交换。
用于包选择和切换的 Visual Studio UI
Visual Studio 在“源代码管理”类别下的“选项”对话框中提供源代码管理 VSPackage 和插件选择的 UI。 它允许用户选择活动源代码管理插件或 VSPackage。 下拉列表包括:
所有已安装的源代码管理包
所有已安装的源代码管理插件
禁用源代码控制的“none”选项
只有活动源代码管理选项的 UI 可见。 VSPackage 选择会隐藏上一个 VSPackage 的 UI,并显示新 VSPackage 的 UI。 根据每个用户选择活动 VSPackage。 如果用户同时打开了多个 Visual Studio 副本,则每个副本都可以使用不同的活动 VSPackage。 如果多个用户登录到同一台计算机,则每个用户可以打开单独的 Visual Studio 实例,每个实例都有不同的活动 VSPackage。 当用户关闭多个 Visual Studio 实例时,最后一个处于活动状态的解决方案的源代码管理 VSPackage 将成为默认源代码管理 VSPackage,并在重新启动时自动设为活动状态。
与以前版本的 Visual Studio 不同,IDE 重启不再是切换源代码管理 VSPackage 的唯一方法。 VSPackage 选择是自动的。 切换包需要 Windows 用户权限(而不是管理员或 Power User)。