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

时间:2014-07-08 18:53:24

标签: c# version-control visual-studio-extensions vspackage

我是扩展Visual Studio的新手,我试图找到解决当前解决方案使用的源控制系统的方法。

我创建了VsPackage项目,我可以通过IVsSolution获得对解决方案的引用,并通过IVsSolutionEvents连接到解决方案事件。

OnAfterSolutionOpen内部(或者可能是其他一些替代方案)我想根据解决方案是使用TFS还是Git或其他方式采取不同的行动。我如何获得这些信息?

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

1 个答案:

答案 0 :(得分:3)

好的,经过几个小时的挖掘后,我找到了解决方法。感谢Mark Rendle的article以及我发现的NoGit extension的源代码,已注册的源代码管理插件列表位于注册表中: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);
}

现在,我发现有两种方法可以获得当前活跃的提供者的指南。

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

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

    var getProvider = GetService(typeof(IVsRegisterScciProvider)) as IVsGetScciProviderInterface;
    Guid pGuid;
    getProvider.GetSourceControlProviderID(out pGuid);
    
  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);
    
  3. 现在我们只需var activeProviderName = dict[currentGuid];即可。