Для чого "Служба включення" у файлі csproj?


194

У рішення C # я додав існуючий проект.
Після цього Visual Studio додав такий запис у інші файли .csproj:

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

Для чого це?
Чи можна її видалити?


1
Рішення складено успішно після його видалення - але питання полягає в тому, що відбувається під час виконання? Я повинен знати, що це робить.
Джо

Відповіді:


260

У мене був подібний випадок, коли це було додано:

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

Виявляється, це включення було створено спеціально VS2013, якщо ви створюєте тестовий проект NUnit, але забудьте позначити його як тестовий проект, як описано в цій відповіді від Microsoft:

Така поведінка навмисна.

Для підтримки сторонніх тестових рамок, таких як NUnit та XUnit, Visual Studio 2012 завантажив Test Explorer на відкритому рішенні, незалежно від того, чи містив він тестові проекти. Це додало секунд затримки до запуску та відкритого сценарію рішення для всіх користувачів, більшість з яких не використовують тести.

У Visual Studio 2013 ми змінили його так, що пакет Test Explorer завантажується лише тоді, коли рішення містить один або кілька тестових проектів. Тестові проекти визначаються двома різними способами. Проекти, створені з одного із вбудованих шаблонів тестових проектів, ідентифікуються за допомогою GUID типів проекту. Інші проекти, такі як проект бібліотеки класів з тестами XUnit або NUnit, ідентифікуються Test Explorer під час першого тестового виявлення та «позначаються» <Service/>елементом.


8
Це все ще корисно для VS 15.3+?
Яанус Варус

5
@JaanusVarus Так, це все ще відбувається в VS 15.4 (я намагався зрозуміти поведінку, і це мене привело сюди). Я не впевнений, чи слід переглянути рішення про ефективність, якщо це було ваше питання.
Ларс Кемман

2
Все ще трапляється в 15.6
димааан

2
@Adrian Це те, як ви позначите це як тестовий проект. VS в основному говорить: "Це виглядає так, що це, мабуть, тестовий проект, тому я збираюся просто продовжити і позначити це для вас". Або додайте тип проекту, згаданий у відповіді Владимира.
GalacticCowboy

2
З Visual Studio 2017 (версія 15.x) ця проблема з’явилася і пішла з життя. Дивіться цю тему для історії. Цей потік також згадує, що це буде остаточно зафіксовано у Visual Studio 15.7
Структуровано

35

Особисто мені не подобається, що ця послуга додається до моїх файлів проекту, і я вважаю, що це скоріше як обхід, а не правильне рішення. Тож маркування ваших тестових проектів як тестових проектів здається мені більш правильним, і цього можна досягти, додавши це до першого PropertyGroup:

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

{3AC096D0-A1C2-E12C-1390-A8335801FDAB}означає Тестовий проект та {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}- C #. Для інших посібників типу проекту перейдіть сюди


11
^ Я ProjectTypeGuidsтеж вважаю за краще, але якщо ви займаєтеся розробкою крос-платформ і використовуєте MonoDevelop, ви не зможете відкривати {3AC096D0-A1C2-E12C-1390-A8335801FDAB}проекти: "Монодевелоп цей тип проекту не підтримується". Обидва IDE здаються щасливими, якщо ви просто видалите GUID тестового проекту.
WynandB

3
Цікаво, які ще можливі типи для <TestProjectType>? Не вдалося знайти жодної інформації про це.
Дж. Поллак

12

Хороша річ у відомих / постійних GUID - це те, що вони дуже унікальні і тому їх дуже легко шукати в Google. Що я і зробив, і знайшов: це і це , а також інші цікаві хіти.
Схоже, це насправді відома помилка в інструменті T4 DSL, який постачається разом із SDK. І на щастя, це досить легко вирішити, змінивши деякі ключі реєстру.


8
І тепер, коли я шукаю, я отримую це ТАКЕ питання ;-).
бінкі

Щоб було зрозуміло, що помилка T4 DSL полягала в тому, що сервісний тег B4F97281-0DBD-4835-9ED8-7DFB966E87FF додано до всіх проектів, навіть якщо вони не використовували T4. Ця помилка була виправлена ​​у Visual Studio 2008. Тег служби все ще додається до проектів, які використовують T4 (хоча GUID інший). Це все ще має місце у VS2017.
duncanp
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.