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

4

我刚开始学习扩展 Visual Studio,现在我正在尝试找到一种方法来查看当前解决方案使用了哪个源代码管理系统。

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

OnAfterSolutionOpen(或者其他可能的替代方案)中,我想根据解决方案使用的是 TFS、Git 还是其他系统来采取不同的操作。如何获取此信息?

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

1个回答

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);
}

现在,我发现有两种方法可以获取当前提供程序的 GUID。
重要更新:显然,通过第二种方式获取当前活动插件的方法不起作用,因此我强烈建议使用第一个解决方案。
  1. This is the way that bases on the extension mentioned earlier:

    var getProvider = GetService(typeof(IVsRegisterScciProvider)) as IVsGetScciProviderInterface;
    Guid pGuid;
    getProvider.GetSourceControlProviderID(out pGuid);
    
  2. Or we can just go to HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0\CurrentSourceControlProvider and get the default value of this key:

    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];,就完成了。

没有人提供更多的见解,所以我将其标记为答案。 - Grzegorz Sławecki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接