API для управления файлами решений и проектов VS (DOM)

Я работаю над сценарием генерации кода, в котором создается все решение, включая проекты, папки, файлы *.cs и все остальное.

В настоящее время я генерирую все файлы программно как текстовые файлы без структуры (DOM). Мне было интересно, есть ли в экосистеме .NET/VS такой API, который может помочь получить больший контроль над этим.

По сути, уметь программно (строго типизировать):

  • Создать решение
  • Создавайте несколько проектов внутри
  • Укажите свойства проекта (например, целевой .NET 8).
  • Создание файлов кода проекта
  • Добавьте ссылки на проект
  • Управляйте свойствами различных элементов, например указывая Build Action для файла и т. д.

Обратите внимание, что я не имею в виду CSCodeProvider, Roslyn или расширения VS. Однако расширения VS являются хорошим примером того, как расширение имеет доступ к открытому в данный момент решению. Он использует MS VS SDK, но я не знаю, можно ли его использовать для управления решениями как API, а не внутри расширения.

Любые идеи были бы хорошы.

Следующее может быть интересно: stackoverflow.com/a/76086626/10024425

user246821 03.08.2024 04:35

О боже, можешь зациклить процесс и отправиться в отпуск :-)

rotabor 03.08.2024 09:41

Посмотрите Nuke

Alexander Petrov 03.08.2024 12:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для проектов я использую библиотеку Microsoft.Build, особенно пространство имен Microsoft.Build.Construction.

Проект представлен классом ProjectRootElement. Вы создаете новый с помощью метода Create и сохраняете его с помощью Save. Проверьте другие методы создания элементов, изменения свойств и т. д. Например, чтобы создать новую группу элементов, например, для ссылок:

/// <summary>
/// Gets the first 'ItemGroup' element in msbuild file that contains an item of specified type.
/// </summary>
/// <param name = "projRoot"></param>
/// <param name = "itemType">The item type to be searched, for example 'Compile', 'Reference', etc. </param>
/// <returns></returns>
/// <remarks>If none such group was found, a new one is created.</remarks>
private static ProjectItemGroupElement GetOrCreateItemGroupWithItemType(ProjectRootElement projRoot, string itemType)
{
    foreach (var item in projRoot.Items)
    {
        if (item.ItemType == itemType)
        {
            return item.Parent as ProjectItemGroupElement;
        }
    }

    return projRoot.AddItemGroup();
}

Чтобы добавить ссылку, используйте такой метод:

/// <summary>
/// Adds the 'Reference' item into msbuild file.
/// </summary>
/// <param name = "itemGroup"></param>
/// <param name = "referencePath">Reference full path or a file name.</param>
/// <returns>Created 'Reference' item.</returns>
/// <remarks></remarks>
private static ProjectItemElement AddReferenceItem(ProjectItemGroupElement itemGroup, string referencePath)
{
    string refFileName = Path.GetFileName(referencePath);
    string refName = Path.GetFileNameWithoutExtension(referencePath);
    string refFolder = "";
    if (referencePath.Length == refFileName.Length)
    {
        // referencePath is just a file name without path
        refFolder = QuickDevis.Common.CommonUtility.ApplicationStartupPath();
    }
    else
    {
        refFolder = Path.GetDirectoryName(referencePath);
    }

    ProjectItemElement res;
    res = itemGroup.AddItem("Reference", refName);
    res.AddMetadata("HintPath", Path.Combine(refFolder, refFileName));

    return res;
}

Одна из проблем заключается в том, что Microsoft.Build не может создавать и редактировать файлы SLN. Он может только анализировать их. Вы можете использовать библиотеку MvsSln (я ее не проверял). Это обсуждалось в разделе Создать решение программно.

Спасибо! Это именно то, что я искал. Я просто искал не там, где нужно (SDK для расширяемости).

Raheel Khan 03.08.2024 20:07

Другие вопросы по теме