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

Я пытаюсь написать надстройку для Visual Studio, которая, среди прочего, должна отслеживать каждый файл в решении Visual Studio. Я знаю, какие события мне нужно подписаться (когда открывается Решение, когда файл добавляется/удаляется/редактируется в нем, то же самое для проектов и т.д.), Но я не понимаю, как получить список файлов из любого из них.

Недавно я установил CodeRush и играл с картой DXCore. Я очень доволен этим подходом к плагинам, но я до сих пор не вижу очевидного способа получить список файлов в решении.

Итак, чтобы подвести итог: Как с помощью Visual Studio SDK или DXCore я получу надежный список файлов в решении и проект?

Ответы

Ответ 1

Все это доступно с помощью DTE в SDK Visual Studio.

Вы можете получить список проектов в решении, используя интерфейс Projects.

Вы можете получить список элементов в проекте, используя интерфейс ProjectItem.

Для получения дополнительной информации я бы рекомендовал прочитать Управление проектами и решениями.

Ответ 2

Спасибо, Рид; статья, которую вы связали, достала меня достаточно далеко, чтобы получить доказательство концепции, выпущенной через пару минут.

Поскольку я чувствую, что это связано, вот итерация и рекурсивные способы, с помощью которых я собрал ProjectItems. Я сделал это в DXCore, но та же идея относится и к необработанному SDK Visual Studio (DXCore - это всего лишь привлекательная оболочка для SDK). Объекты "Решение", "Проекты", "Проект" и "ProjectItem" находятся прямо в EnvDTE.

Настройка проектов

EnvDTE.Solution solution = CodeRush.ApplicationObject.Solution;
EnvDTE.Projects projects = solution.Projects;

Итерация по проектам для вытягивания ProjectItems

var projects = myProjects.GetEnumerator();
while (projects.MoveNext())
{
    var items = ((Project)projects.Current).ProjectItems.GetEnumerator();
    while (items.MoveNext())
    {
        var item = (ProjectItem)items.Current;
        //Recursion to get all ProjectItems
        projectItems.Add(GetFiles(item));
    }
}

Наконец, рекурсия, которую я делаю для получения всех ProjectItems в активном решении

ProjectItem GetFiles(ProjectItem item)
{
    //base case
    if (item.ProjectItems == null)
        return item;

    var items = item.ProjectItems.GetEnumerator();
    while (items.MoveNext())
    {
        var currentItem = (ProjectItem)items.Current;
        projectItems.Add(GetFiles(currentItem));
    }

    return item;
}

Ответ 3

Смотрите EnvDTE: Получение всех проектов (SolutionPolder PITA)

Это решение работает блестяще, чтобы получить все проекты в решении, даже если проекты находятся в подпапках.

Обязательно прочитайте комментарии ниже кода, поскольку он указывает на существенное исправление, используйте это, чтобы захватить DTE2 вместо исходного кода, иначе он не получит правильный экземпляр Visual Studio:

DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as DTE2;

(код был обновлен, чтобы включить исправление выше)