注册和选择(源代码管理 VSPackage)
必须注册源代码管理 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 必须创建以下注册表项:
项名 | 条目 |
---|---|
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> 的选择<)。 |
(default) = 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 之间的切换。
源代码管理适配器包用于切换到任何基于源代码管理插件的插件。 切换到中间源代码管理适配器包并确定哪些源代码管理插件必须设置为活动或非活动状态的过程对用户是透明的。 当任何源代码管理插件处于活动状态时,适配器包始终处于活动状态。 在两个源代码管理插件之间进行切换相当于直接加载和卸载插件 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 用户权限(不管理员istrator 或 Power User)。