Получить список файлов решений / проектов для надстройки VS или плагина DXCore
Я пытаюсь написать надстройку для Visual Studio, которая, помимо прочего, должна отслеживать каждый файл в решении Visual Studio. Я знаю, на какие события мне нужно подписаться (когда открывается решение, когда в него добавляется / удаляется / редактируется файл, то же самое для проектов и т. Д.), Но я не понимаю, как на самом деле получить список файлов от любого из этого.
Я недавно установил CodeRush и играю с платформой DXCore. Я очень доволен его подходом к плагинам, но я все еще не вижу очевидного способа получить список файлов в решении.
Итак, подведем итоги: как через Visual Studio SDK или DXCore получить надежный список файлов в решении и его проектах?
3 ответа
Все это легко доступно с помощью DTE в Visual Studio SDK.
Вы можете получить список проектов в решении, используя интерфейс Projects.
Вы можете получить список элементов в проекте, используя интерфейс ProjectItem.
Для получения дополнительной информации, я бы порекомендовал прочитать о контроле проектов и решений.
Спасибо, Рид; статья, которую вы связали, дала мне достаточно далеко, чтобы получить подтверждение концепции за несколько минут.
Поскольку я чувствую, что это связано, вот итерационные и рекурсивные средства, с помощью которых я собрал 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));
}
}
Наконец, рекурсия, которую я делаю для получения всех элементов ProjectI в активном решении.
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;
}
См. EnvDTE: Получение всех проектов (SolutionFolder PITA)
Это решение прекрасно работает, чтобы включить все проекты в решение, даже если проекты находятся в подпапках.
Обязательно прочитайте комментарии под кодом, так как он указывает на существенное исправление, используйте его, чтобы получить DTE2 вместо исходного кода, иначе он не получит правильный экземпляр Visual Studio:
DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as DTE2;
(код был обновлен для включения вышеуказанного исправления)