Visual studio 2017 在Visual Studio 2017中迭代VCFilter树

Visual studio 2017 在Visual Studio 2017中迭代VCFilter树,visual-studio-2017,visual-studio-extensions,Visual Studio 2017,Visual Studio Extensions,我有一个VS2013插件,我正在将其移植到VS2017,我发现自己无法像2013年那样迭代项目中的过滤器。这是我的代码: public void OnSolutionLoaded() { DTE2 dte = Package.GetGlobalService(typeof(DTE)) as DTE2; foreach (Project lProject in dte.Solution.Projects) { if(lProject.Kind == vcC

我有一个VS2013插件,我正在将其移植到VS2017,我发现自己无法像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了,但那不是开着的。我正在运行VS15.1

我做错了什么

编辑:在添加解决方案文件夹之前,上述代码将按预期工作,然后递归将不再工作。我认为这是一个bug,因为这与VS2013中的行为不同


请检查过滤器顶层是否有子过滤器。像这样:

如果您有上述过滤器,您可以点击递归中的断点(演示由visual studio 2017 15.1版创建),如下所示:


当从缓存加载项目时,VS 15.1在vc过滤器中仍然存在缺陷(请参阅 如何启用/禁用vc项目缓存)

该漏洞将在即将到来的VS更新中修复(最有可能是15.3)

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


作为一个解决方案,请设置工具-选项-文本编辑器-C/C++ +实验-“更快的项目加载”到false

如果我创建一个新的C++项目,它是按预期的工作,但是我在它上面迁移的现有的2013个项目仍然没有遍历层次结构。我只得到顶级过滤器。如果我创建一个新的2013项目并将其导入2017年,它工作正常,因此我的特定项目有一些奇怪的地方好的,发现了问题,是解决方案文件夹。一旦你添加其中一个,它就会破坏树迭代。我很高兴知道你发现了问题,你解决了问题还是遇到了任何问题?它被破坏了,我刚刚缩小了复制范围。我可以重构我的解决方案来删除所有的解决方案文件夹,但我真的不愿意。遗憾的是,即使禁用了更快的项目加载,我仍然会遇到同样的问题。现在它开始工作了。不知道为什么,可能是因为重启了。谢谢你的帮助。