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

C# 如何在VSPackage中找到解决方案使用的版本控制系统,c#,version-control,visual-studio-extensions,vspackage,C#,Version Control,Visual Studio Extensions,Vspackage,我是扩展VisualStudio的新手,我正试图找到一种方法来找到当前解决方案所使用的源代码管理系统 我创建了VsPackage项目,可以通过IVsSolution获取解决方案的参考,并通过IVsSolutionEvents连接到解决方案事件 在解决方案打开后的内部(或者如果有替代方案,可能是其他的),我希望根据解决方案是使用TFS还是Git或其他东西来采取不同的行动。我如何获得这些信息 我计划支持尽可能多的Visual Studio版本,但如果不可能,我希望至少支持VS2012及更高版本。好的

我是扩展VisualStudio的新手,我正试图找到一种方法来找到当前解决方案所使用的源代码管理系统

我创建了VsPackage项目,可以通过
IVsSolution
获取解决方案的参考,并通过
IVsSolutionEvents
连接到解决方案事件

在解决方案打开后的
内部(或者如果有替代方案,可能是其他的),我希望根据解决方案是使用TFS还是Git或其他东西来采取不同的行动。我如何获得这些信息


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

好的,经过几个小时的挖掘,我找到了解决方案。多亏了Mark Rendle和他的源代码,我发现注册的源代码控制插件列表位于注册表中:
HKEY\U CURRENT\u USER\Software\Microsoft\VisualStudio\12.0\u 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);
}
  • 或者,我们可以转到
    HKEY\U CURRENT\U 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);
    

  • 现在我们只取
    var-activeProviderName=dict[currentGuid]仅此而已。

    没有人提供更多的见解,因此我将此标记为答案。
    var key2 = @"Software\Microsoft\VisualStudio\12.0\CurrentSourceControlProvider";
    var guidString = (string)Microsoft.Win32.Registry.CurrentUser.OpenSubKey(key2).GetValue("");
    var currentGuid = Guid.Parse(guidString);