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

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

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

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

Ответы [ 3 ]

18 голосов
/ 17 сентября 2009

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

Поскольку я чувствую, что это связано, вот итерационные и рекурсивные средства, с помощью которых я собрал элементы ProjectItems. Я сделал это в DXCore, но та же идея применима и к сырому Visual Studio SDK (DXCore - просто более приятная оболочка над SDK). Объекты «Solution», «Projects», «Project» и «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;
}
5 голосов
/ 16 сентября 2009

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

Список проектов в решении можно получить с помощью интерфейса Projects .

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

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

1 голос
/ 06 ноября 2013

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

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

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

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

(код был обновлен для включения вышеуказанного исправления)

...