如何在 VSPackage 中找到解决方案使用的版本控制系统

Grz*_*cki 4 c# version-control vspackage visual-studio-extensions

我是扩展 Visual Studio 的新手,我正在尝试寻找方法来查找当前解决方案使用的源代码管理系统。

我创建了 VsPackage 项目,并且能够IVsSolution通过IVsSolutionEvents.

在内部OnAfterSolutionOpen(或者可能是其他的,如果有其他选择)我想根据解决方案是使用 TFS 还是 Git 或其他东西来采取不同的行动。我怎样才能获得这些信息?

我计划支持尽可能多的 Visual Studio 版本,但如果不可能,我希望至少支持 VS2012 及更高版本。

Grz*_*cki 5

好的,经过几个小时的挖掘,我找到了解决方案。感谢Mark Rendle的文章和我发现的他的NoGit 扩展的源代码,已注册的源代码控制插件列表位于注册表中:(HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0_Config\SourceControlProviders在 VS 2013 的情况下)。

所以现在,我们可以同时拥有插件 guid 和提供者的名称。此示例代码可以获取这些值:

var key = @"Software\Microsoft\VisualStudio\" + "12.0" + @"_Config\SourceControlProviders";

var subkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(key);
var providerNames = subkey.GetSubKeyNames().Dump();
var dict = new Dictionary<Guid, String>();
foreach (var provGuidString in subkey.GetSubKeyNames())
{
    var provName = (string)subkey.OpenSubKey(provGuidString).GetValue("");
    dict.Add(Guid.Parse(provGuidString), provName);
}
Run Code Online (Sandbox Code Playgroud)

现在,我发现有两种方法可以获取当前活动提供者的 guid。

重要更新:显然,获取当前活动插件的第二种方法无法按预期工作。我强烈建议使用第一个解决方案。

  1. 这是基于前面提到的扩展的方式:

    var getProvider = GetService(typeof(IVsRegisterScciProvider)) as IVsGetScciProviderInterface;
    Guid pGuid;
    getProvider.GetSourceControlProviderID(out pGuid);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或者我们可以直接去HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0\CurrentSourceControlProvider获取这个键的默认值:

    var key2 = @"Software\Microsoft\VisualStudio\12.0\CurrentSourceControlProvider";
    var guidString = (string)Microsoft.Win32.Registry.CurrentUser.OpenSubKey(key2).GetValue("");
    var currentGuid = Guid.Parse(guidString);
    
    Run Code Online (Sandbox Code Playgroud)

现在我们只需要var activeProviderName = dict[currentGuid];,仅此而已。