Co to jest „Service Include” w pliku csproj?

194

W rozwiązaniu C # dodałem istniejący projekt.
Następnie program Visual Studio dodał następujący wpis w innych plikach .csproj:

<ItemGroup>
    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
</ItemGroup>

Po co to jest?
Czy mogę to usunąć?

Joe
źródło
1
Rozwiązanie zostało pomyślnie skompilowane po usunięciu - ale pytanie brzmi: co dzieje się w czasie wykonywania? Muszę wiedzieć, co to robi.
Joe

Odpowiedzi:

260

Miałem podobny przypadek, w którym to dodano:

<ItemGroup>
  <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>

To włączenie okazuje się być generowane celowo przez VS2013, jeśli utworzysz projekt testowy NUnit, ale zapomnij oznaczyć go jako projekt testowy, zgodnie z opisem w odpowiedzi firmy Microsoft:

To zachowanie jest celowe.

Aby obsługiwać platformy testowe innych firm, takie jak NUnit i XUnit, program Visual Studio 2012 załadował Eksploratora testów do otwartego rozwiązania, niezależnie od tego, czy zawierał projekty testowe. To dodało sekundy opóźnienia do scenariuszy uruchamiania i otwierania rozwiązania dla wszystkich użytkowników, z których większość nie korzysta z testów.

W Visual Studio 2013 zmieniliśmy go tak, aby pakiet Test Explorer był ładowany tylko wtedy, gdy rozwiązanie zawiera jeden lub więcej projektów testowych. Projekty testowe są identyfikowane na dwa różne sposoby. Projekty utworzone na podstawie jednego z wbudowanych szablonów projektów testów jednostkowych są identyfikowane za pomocą identyfikatorów GUID typu projektu. Inne typy projektów, takie jak projekt biblioteki klas z testami XUnit lub NUnit, są identyfikowane przez Eksploratora testów podczas pierwszego wykrywania testu i „oznaczane” <Service/>elementem.

avandeursen
źródło
8
Czy nadal jest przydatny dla VS 15.3+?
Jaanus Varus,
5
@JaanusVarus Tak, to nadal występuje w VS 15.4 (Próbowałem zrozumieć zachowanie i to mnie tu doprowadziło). Nie jestem pewien, czy należy ponownie rozważyć decyzję dotyczącą wydajności, czy to było twoje pytanie.
Lars Kemmann
2
Nadal występuje w 15,6
dimaaan
2
@Adrian W ten sposób oznaczysz go jako projekt testowy. VS w zasadzie mówi: „Wygląda na to, że to prawdopodobnie projekt testowy, więc zamierzam po prostu to zaznaczyć.” Lub dodaj typ projektu wymieniony w odpowiedzi Vladimira.
GalacticCowboy
2
W programie Visual Studio 2017 (wersja 15.x) ten problem zniknął. Zobacz ten wątek, aby uzyskać historię. W tym wątku wspomniano również, że zostanie to ostatecznie naprawione w programie Visual Studio 15.7
Struct
35

Osobiście nie podoba mi się ta usługa dodana do moich plików projektu i myślę, że jest to raczej obejście niż właściwe rozwiązanie. Tak więc oznaczanie projektów testowych jako projektów testowych wydaje mi się bardziej poprawne i można to osiągnąć, dodając to do pierwszego PropertyGroup:

<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<TestProjectType>UnitTest</TestProjectType>

{3AC096D0-A1C2-E12C-1390-A8335801FDAB} oznacza Projekt testowy i {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - C #. W przypadku innych typów przewodników projektu przejdź tutaj

Vladimirs
źródło
11
^ Ja ProjectTypeGuidsteż wolę, ale jeśli robisz programowanie na wiele platform i używasz MonoDevelop, nie będziesz mógł otwierać {3AC096D0-A1C2-E12C-1390-A8335801FDAB}projektów: „Ten typ projektu nie jest obsługiwany przez MonoDevelop”. Oba IDE wydają się szczęśliwe, jeśli po prostu usuniesz GUID typu projektu testowego.
WynandB
3
Zastanawiam się, jakie są inne możliwe typy <TestProjectType>? Nie można znaleźć żadnych informacji na ten temat.
J Pollack
12

Zaletą dobrze znanych / stałych identyfikatorów GUID jest to, że są one prawie unikalne, a zatem bardzo łatwe do wyszukiwania w Google. Co zrobiłem i znalazłem: to i to , a także inne ciekawe hity.
Wygląda na to, że jest to znany błąd w narzędziu T4 DSL dostarczanym z SDK. Na szczęście rozwiązanie jest łatwe dzięki zmianie niektórych kluczy rejestru.

Polyfun
źródło
8
A teraz, kiedy go szukam, otrzymuję to SO pytanie ;-).
binki,
Żeby było jasne, że błąd T4 DSL polegał na tym, że tag serwisowy B4F97281-0DBD-4835-9ED8-7DFB966E87FF był dodawany do wszystkich projektów, nawet jeśli nie korzystały z T4. Ten błąd został naprawiony w Visual Studio 2008. Tag projektu jest nadal dodawany do projektów korzystających z T4 (chociaż GUID jest inny). Tak jest nadal w przypadku VS2017.
duncanp