2016-11-02 10 views
5

PodsumowanieJak mogę przeładować Microsoft.Build.Evaluation.Project w MSBuild 14,0

Jeśli załadować .csproj na przykład projektu, zmień .csproj na dysku, a następnie próbować odświeżyć .csproj (bez zatrzymywania aplikacji), moje zmiany nie pojawiają się na nowo załadowanej instancji projektu, tak jakby były gdzieś buforowane.

Szczegółowe kroki

używam klasy Microsoft.Build.Evaluation.Project w MSBuild 14,0.

załadować projekt następująco:

MyProject = new Project(fileName);

fileName plik jest .csproj na moim komputerze lokalnym.

Kiedy projekt został załadowany do pamięci, to upewnij się, że zawiera ona konkretny plik o nazwie Class2.cs oceniając AllEvaluatedItems w oknie zegarek, który pokazuje:

"Compile"="Class2.cs" ["Class2.cs"] #DirectMetadata=0 Microsoft.Build.Evaluation.ProjectItem

I wtedy otworzyć. plik csproj w edytorze tekstu i znajdź wpis Class2:

<Compile Include="Class2.cs" />

Następnie usunąć ten wpis z mojego pliku .csproj (gdy aplikacja która Ori załadowany ginally do instancji Project nadal działa) i zapisać plik .csproj.

Następnie rozładować i załadować projekt następująco:

MyProject.ProjectCollection.UnloadProject(MyProject); // call the same code to reload the project from the same .csproj location: MyProject = new Project(fileName);

Wreszcie poszerzyć AllEvaluatedItems nowo utworzonej instancji w oknie zegarka, widzę Class2 pokazać się ponownie, a jeśli projekt jest nie ładuje się z dysku.

Czy jest coś w rodzaju buforowania, które się dzieje? Czy muszę zrobić coś innego, aby wyładować projekt z dysku i załadować go ponownie?

Odpowiedz

1

Wygląda na to, że kolekcja ProjectCollection, która jest częścią projektu, wykonuje pewnego rodzaju buforowanie, pomimo wywołania zwalniania. Zmieniłem obciążenie projekt następująco:

MyProject = new Project(fileName, null, null, new ProjectCollection());

Podaj nowy ProjectCollection za każdym razem wydaje się usunąć pamięć podręczną, a projekt jest prawidłowo ładowane z dysku.

0

Inną metodą ładowania zmian do projektu jest wywołanie MyProject.ReevaluateIfNecessary(). Pozwoli to zaoszczędzić Ci cykl rozładowywania/odtwarzania.

Powiązane problemy