Opracowałem generator kodu do użytku wewnętrznego, w którym zasoby kodu (POCO) są generowane w oparciu o interfejsy C#. Proces generowania kodu programowo dodaje/usuwa elementy do pliku csproj. Przepływ pracy wygląda następująco: programista dodaje nowy interfejs C# lub usuwa istniejący interfejs C# w programie Visual Studio 2017. Jeśli programista najpierw zapisze plik projektu, a następnie uruchom generator kodu, wszystko działa zgodnie z oczekiwaniami. Zasoby generowane przez kod są dodawane do projektu (lub usuwane), a Visual Studio odpowiednio je uwzględnia. Jeśli jednak deweloper nie zapisał pliku csproj przed uruchomieniem generatora kodu i usunął interfejs C#, zasoby generowane przez kod nie są usuwane z projektu, ponieważ program Visual Studio nie akceptuje modyfikacji pliku csproj.W jaki sposób program Visual Studio 2017 akceptuje modyfikacje pliku csproj
Wewnątrz generatora kodu fizycznie usuwam odniesienia do plików wygenerowanych przez kod, które są usuwane i zapisuję plik csproj. Weryfikuję, że przywoływane pliki są usuwane z pliku csproj, otwierając csproj w notatniku. Jednak zaraz po włączeniu Visual Studio Visual Studio rozpoznaje, że plik csproj został zmieniony i pyta, czy chcę odrzucić, nadpisać, zapisać jako itp., A zmiany dokonane w pliku csproj z mojego procesu generowania kodu zostaną utracone. Visual Studio dodaje odwołania do usuniętych plików z powrotem do pliku csproj. Próbowałem odrzucić, nadpisać, zapisać jako itp. I nie dostaję Visual Studio, aby zaakceptować nowo zmodyfikowany plik csproj (który ma odniesienia do usuniętych usuniętych plików).
Oto mój kod do usuwania trwałych kodów generowanych:
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);
}
}
Czy to możliwe, aby mieć Visual Studio prostu zaakceptować nowy plik csproj? Czy jest jakieś ustawienie, które muszę wprowadzić do pliku csproj podczas usuwania zasobów? Posiadanie programu Visual Studio do zbuforowania zmodyfikowanego pliku csproj utrudnia korzystanie z generatora kodu do usuwania potrzebnych zasobów generowanych przez kod (wynikających z fizycznego usunięcia pliku interfejsu C#).
EDIT
Oto film pokazujący proces uruchomiony generator T4 wewnątrz Visual Studio generowania # aktywa C w oparciu o interfejs C#. Usuwam źródłowy interfejs C#, ponownie uruchamiam generator kodu, a plik projektu jest odpowiednio aktualizowany, powodując ponowne załadowanie projektu.
https://www.screencast.com/t/JWTE0LpkXZGX
Problemem nie jest to, że projekt zostanie przeładowana. Problem polega na tym, że aktualizacje generatora kodu i zapisują plik csproj poza programem Visual Studio, co powoduje błąd programu Visual Studio, ponieważ plik csproj został zmieniony. W jaki sposób program Visual Studio "cicho" akceptuje zmiany zapisane w pliku csproj?
Dzięki za pomoc.
ty uruchomiony generator kodu z celu msbuild podczas budowania lub poza procesem kompilacji jako samodzielnego exe/tool? większość podejść do generacji integruje się w msbuild, dzięki czemu mogą dynamicznie dodawać kod nawet podczas projektowania w czasie kompilacji w VS bez potrzeby edytowania pliku projektu –
Więc zasadniczo pierwsze wywołanie metody project.Save() nie ma wpływu na VS? – stijn
Jest to samodzielny generator kodu napisany z plikami T4. Nie jestem pewien, jak zintegrować T4 z MS Build. Pierwszy project.save() nie wydaje się wpływać na visual studio. Drugie zapisanie następuje po usunięciu przestarzałych zasobów kodu, a VS zostanie wyświetlony monit o przeładowanie. Ale wygląda na to, że VS ma własną wersję projektu w pamięci, która jest innym plikiem csproj, który został załadowany/zmodyfikowany/zapisany w zasięgu generatora kodu. –