Visual Studio 2017 年迭代 VCFilter 树

Iterating VCFilter tree in Visual Studio 2017

我有一个要移植到 VS2017 的 VS2013 插件,但我发现自己无法以在 2013 年工作正常的方式迭代项目中的过滤器。这是我的代码:

public void OnSolutionLoaded()
{
    DTE2 dte = Package.GetGlobalService(typeof(DTE)) as DTE2;
    foreach (Project lProject in dte.Solution.Projects)
    {
         if(lProject.Kind == vcContextGuids.vcContextGuidVCProject)
         {
             VCProject proj = (VCProject)lProject.Object;
             foreach (VCFilter childFilter in (IVCCollection)proj.Filters)
             {
                 RecurseFilters(childFilter);
             }
          }
     }
}

private void RecurseFilters(VCFilter filter)
{
    foreach(VCFilter childFilter in (IVCCollection)filter.Filters)
    {
        RecurseFilters(childFilter);
    }
}

如果我在递归中设置断点,尽管我在过滤器中有很多过滤器,但它永远不会命中。发现顶级过滤器很好。

我已经检查了 LSL,但没有打开。我是 运行 VS 15.1.

我做错了什么?

编辑:以上代码按预期工作,直到您添加解决方案文件夹,然后递归不再有效。我认为这是一个错误,因为这与 VS2013

中的行为不同

请检查它是否在顶级过滤器上有子过滤器。像这样:

如果你有上面的过滤器,你可以在递归中打断点。(该演示由 visual studio 2017 版本 15.1 创建)如下所示:

当从缓存加载项目时,VS 15.1 在 vc 过滤器中仍然存在错误(请参阅 https://blogs.msdn.microsoft.com/vcblog/2016/10/05/faster-c-solution-load-with-vs-15/ 如何 enable/disable vc 项目缓存)。

该错误将在即将发布的 VS 更新之一(最有可能是 15.3)中修复。

并解释您看到的行为:当解决方案中只有一个项目时不使用项目缓存,但一旦有两个或更多(并且解决方案文件夹算作一个项目),桌面 vc 项目正在使用不同的实现,它从缓存中读取而不是加载 msbuild 项目。

因此,作为目前的解决方法,请将工具 - 选项 - 文本编辑器 - C/C++ - 实验性 - 'Enable Faster Project Load' 设置为 false