Для чего нужно «Service Include» в файле 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, определяются в обозревателе тестов при первом обнаружении теста и «помечаются» этим <Service/>элементом.

avandeursen
источник
8
Это все еще полезно для VS 15.3+?
Яан Варус
5
@JaanusVarus Да, это все еще происходит в VS 15.4 (я пытался понять поведение, и это привело меня сюда). Я не уверен, что решение о производительности следует пересмотреть, если это был ваш вопрос.
Ларс Кемманн
2
По-прежнему происходит в 15.6
dimaaan
2
@Adrian Вот как вы помечаете его как тестовый проект. VS в основном говорит: «Похоже, что это, вероятно, тестовый проект, поэтому я просто собираюсь отметить это для вас». Или добавьте тип проекта, указанный в ответе Владимира.
GalacticCowboy
2
В Visual Studio 2017 (версия 15.x) эта проблема исчезла и исчезла. Смотрите эту ветку для истории. Этот поток также упоминает, что это будет окончательно исправлено в Visual Studio 15.7
Struct
35

Лично мне не нравится, что этот сервис добавлен в мои файлы проекта, и я думаю, что это скорее обходной путь, чем правильное решение. Таким образом, пометить ваши тестовые проекты как тестовые проекты мне кажется более правильным, и этого можно достичь, добавив это к первому PropertyGroup:

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

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

Владимиров
источник
11
^ Я ProjectTypeGuidsтоже предпочитаю, но если вы занимаетесь кроссплатформенной разработкой и используете MonoDevelop, вы не сможете открывать {3AC096D0-A1C2-E12C-1390-A8335801FDAB}проекты: «Этот тип проекта не поддерживается MonoDevelop». Обе IDE кажутся счастливыми, если вы просто удалите GUID типа тестового проекта.
WynandB
3
Интересно, каковы другие возможные типы для <TestProjectType>? Не могу найти информацию об этом.
J Поллак
12

Хорошая особенность известных / постоянных идентификаторов GUID заключается в том, что они в значительной степени уникальны и поэтому их очень легко найти в Google. Что я и сделал, и нашел: это и это , а также другие интересные хиты.
Похоже, что это на самом деле известная ошибка в инструменте T4 DSL, который поставляется с SDK. И, к счастью, это достаточно легко решить, изменив некоторые ключи реестра.

Polyfun
источник
8
И теперь, когда я ищу это, я получаю этот ТАК вопрос ;-).
Бинки
Просто чтобы быть ясно, что ошибка T4 DSL заключалась в том, что служебный тег B4F97281-0DBD-4835-9ED8-7DFB966E87FF добавлялся во все проекты, даже если они не использовали T4. Эта ошибка была исправлена ​​в Visual Studio 2008. Сервисный тег все еще добавляется в проекты, которые используют T4 (хотя GUID отличается). Это все еще в случае с VS2017.
Дунканп