Я разработал генератор кода для внутреннего использования, в котором ресурсы кода (POCO) создаются на основе интерфейсов C #. Процесс генерации кода программно добавляет / удаляет элементы в файл csproj. Рабочий процесс выглядит следующим образом: разработчик добавляет новый интерфейс C # или удаляет существующий интерфейс C # в Visual Studio 2017. Если разработчик сначала сохраняет файл проекта, а затем запускает генератор кода, все работает должным образом. Сгенерированные кодом ресурсы либо добавляются в проект (или удаляются), и Visual Studio соответствующим образом отражает эти изменения. Однако, если разработчику не удается сохранить файл csproj перед запуском генератора кода и он удалил интерфейс C #, то созданные с помощью кода ресурсы не удаляются из проекта, поскольку Visual Studio не принимает модификации файла csproj.
Внутри генератора кода я физически удаляю ссылки на удаленные файлы, созданные кодом, и сохраняю файл csproj. Я проверяю, что указанные файлы удалены из файла csproj, открыв csproj в блокноте. Однако, как только я сфокусируюсь на Visual Studio, Visual Studio распознает, что файл csproj изменился, и спросит, хочу ли я отменить, перезаписать, сохранить как и т. Д., А изменения, внесенные в файл csproj из моего процесса генерации кода, потеряны. Visual Studio добавляет ссылки на удаленные файлы обратно в файл csproj. Я пробовал отбросить, перезаписать, сохранить как и т. Д., И я не заставляю Visual Studio принять недавно измененный файл csproj (в котором удалены ссылки на удаленные файлы).
Вот мой код для удаления активов, сгенерированных кодом:
using Microsoft.Build.Evaluation;
using Microsoft.Build.Logging;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
public static void RemoveGeneratedFilesFromProject(String projectPath)
{
UnloadAnyProject();
var project = ProjectCollection.GlobalProjectCollection.LoadedProjects.FirstOrDefault(pr => pr.FullPath == projectPath);
//ATTEMPT TO SAVE PROJECT IN CASE DEVELOPER DID NOT...
project.Save();
//GET A LIST OF ITEMS CONTAINING PATH TO CODE-GENERATED ASSETS ("Generated\API")
IList<ProjectItem> generatedItemsList = project.GetItems("Compile").Where(item => item.EvaluatedInclude.Contains(@"Generated\Api")).ToList();
foreach (var item in generatedItemsList)
{
project.RemoveItem(item);
}
//SAVE PROJECT TO REFLECT ALL OF THE CODE GENERATED ITEMS REMOVED FROM PROJECT FILE
project.Save();
UnloadAnyProject();
}
private static void UnloadAnyProject()
{
ProjectCollection projcoll = ProjectCollection.GlobalProjectCollection;
foreach (Project project in projcoll.LoadedProjects)
{
ProjectCollection mypcollection = project.ProjectCollection;
mypcollection.UnloadProject(project);
}
}
Возможно ли, чтобы Visual Studio просто приняла новый файл csproj? Есть ли какие-то настройки, которые мне нужно сделать в файле csproj при удалении ресурсов? Если Visual Studio блокирует измененный файл csproj, это снижает полезность генератора кода для удаления генерируемых кодом активов, которые больше не нужны (в результате физического удаления файла интерфейса C #).
ИЗМЕНИТЬ
Вот видео, показывающее процесс запуска генератора T4 внутри Visual Studio, генерирующего ресурсы C # на основе интерфейса C #. Я удаляю исходный интерфейс C #, повторно запускаю генератор кода, и файл проекта обновляется соответствующим образом, вызывая перезагрузку проекта.
https://www.screencast.com/t/JWTE0LpkXZGX
Проблема не в том, что проект перезагружается. Проблема заключается в том, что генератор кода обновляет и сохраняет файл csproj вне Visual Studio, что приводит к путанице в Visual Studio из-за изменения файла csproj. Как заставить Visual Studio «незаметно» принять изменения, сохраненные в файле csproj?
Спасибо за вашу помощь.