Я работаю над сценарием генерации кода, в котором создается все решение, включая проекты, папки, файлы *.cs и все остальное.
В настоящее время я генерирую все файлы программно как текстовые файлы без структуры (DOM). Мне было интересно, есть ли в экосистеме .NET/VS такой API, который может помочь получить больший контроль над этим.
По сути, уметь программно (строго типизировать):
Build Action
для файла и т. д.Обратите внимание, что я не имею в виду CSCodeProvider, Roslyn или расширения VS. Однако расширения VS являются хорошим примером того, как расширение имеет доступ к открытому в данный момент решению. Он использует MS VS SDK, но я не знаю, можно ли его использовать для управления решениями как API, а не внутри расширения.
Любые идеи были бы хорошы.
О боже, можешь зациклить процесс и отправиться в отпуск :-)
Посмотрите Nuke
Для проектов я использую библиотеку 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 для расширяемости).
Следующее может быть интересно: stackoverflow.com/a/76086626/10024425