Я разработал генератор кода для внутреннего использования, где активы кода (POCOs) создаются на основе интерфейсов С#. Процесс генерации кода программно добавляет/удаляет элементы в файл csproj. Рабочий процесс выглядит следующим образом: разработчик добавляет новый интерфейс С# или удаляет существующий интерфейс С# в Visual Studio 2017. Если разработчик сначала сохраняет файл проекта, а затем запускает генератор кода, тогда все работает так, как ожидалось. Сгенерированные кодом активы либо добавляются в проект (или удаляются), и Visual Studio соответствующим образом отражает эти изменения. Однако, если разработчику не удалось сохранить файл csproj перед запуском генератора кода и удалил интерфейс С#, тогда генерируемые кодом активы не будут удалены из проекта, потому что 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, это затрудняет полезность генератора кода для удаления уже сгенерированных кодом активов (связанных с физическим удалением файла интерфейса С#).
ИЗМЕНИТЬ
Здесь показано видео, показывающее процесс запуска генератора T4 внутри Visual Studio, генерирующего ресурсы С# на основе интерфейса С#. Я удаляю исходный С# -интерфейс, повторно запускаю генератор кода, и файл проекта обновляется соответственно, заставляя проект перезагружаться.
https://www.screencast.com/t/JWTE0LpkXZGX
Проблема не в том, что проект перезагружается. Проблема заключается в обновлении генератора кода и сохраняет файл csproj за пределами Visual Studio, что заставляет Visual Studio запутываться, потому что файл csproj изменился. Как заставить Visual Studio "молча" принимать изменения, сохраненные в файле csproj?
Спасибо за вашу помощь.