Попытка перебрать все документы в решении, но ProjectItem.ProjectItems имеет значение null - PullRequest
0 голосов
/ 17 октября 2019

Я пишу расширение Visual Studio и хочу перебрать все файлы в текущем решении (чтобы найти файлы с одинаковыми именами, игнорируя расширения). Посмотрев вокруг, я обнаружил, что могу перебрать все проекты в решении и оттуда рекурсивно по всем элементам Project и их дочерним элементам.

В небольшом примере решения на C # это работает хорошо, но если я попробую это на большем решении C ++ с работы, это не так. В этом решении все проекты сортируются в папках решений. Solution.Projects содержит указанные папки, а свойство ProjectItems каждой папки содержит проекты (файлы vcxproj). НО все эти ProjectItems свойства проекта являются нулевыми. Не пусто, ноль. Таким образом, рекурсия заканчивается довольно быстро и не видит ни одного фактического документа.

Какого черта? Что я могу сделать по этому поводу? Как я могу получить документы здесь?

Я уже посмотрел на эти два. Принятые ответы есть то, что у меня уже есть: /

Перечислить все файлы в текущем проекте Visual Studio

Получить список файлов решений / проектов для VSПлагин или плагин DXCore

Мой код, запускающий рекурсию

DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as DTE2;
foreach (Project project in dte2.Solution.Projects)
{
    OpenAll(project.ProjectItems);
}

рекурсивная функция

protected void OpenAll(ProjectItems _aItems)
{
    Dispatcher.VerifyAccess();
    foreach (ProjectItem item in _aItems)
    {
        if (item.Name != null)
        {
            string name = item.Name.Contains(".") ? item.Name.Substring(0, item.Name.IndexOf('.')) : item.Name;
            if (string.Compare(StrName, name, true) == 0 && !item.IsOpen)
            {
                // if it's an item with the right name open it
                item.Open();
            }
        }
        if (item.ProjectItems != null && item.ProjectItems.Count > 0)
        {
            // Process sub items
            // I NEVER GET HERE BECAUSE ProjectItems IS NULL!
            OpenAll(item.ProjectItems);
        }
    }
}
...