在Visual Studio 2017中迭代VCFilter树

时间:2017-04-10 11:11:58

标签: 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 == 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中的行为不同

Example of breaking solution folder

2 个答案:

答案 0 :(得分:1)

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

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

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

现在作为解决方法,请设置工具 - 选项 - 文本编辑器 - C / C ++ - 实验 - '启用更快的项目加载'为假

答案 1 :(得分:0)

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

enter image description here

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

enter image description here