Если вы продолжите пытаться заставить свой сервис взаимодействовать напрямую с рабочим столом пользователя, вы проиграете: даже при самых лучших обстоятельствах (то есть «до Vista») это чрезвычайно сложно.
Windows внутренне управляет несколькими оконными станциями , каждая со своим рабочим столом. Оконная станция, назначенная службам, работающим под данной учетной записью, полностью отличается от оконной станции вошедшего в систему интерактивного пользователя. Кросс-оконный доступ к станции всегда вызывал недовольство, поскольку это угроза безопасности, но, хотя предыдущие версии Windows допускали некоторые исключения, они были в основном устранены в Vista и более поздних операционных системах.
Наиболее вероятная причина, по которой ваша служба зависает при запуске, заключается в том, что она пытается взаимодействовать с несуществующим рабочим столом (или предполагает, что Explorer запускается в сеансе пользователя системы, что также не так), или ожидает ввода от невидимый рабочий стол.
Надежное исправление * для этих проблем заключается в удалении всего кода пользовательского интерфейса из вашей службы и перемещении его в отдельный исполняемый файл, который запускается в интерактивном сеансе пользователя (исполняемый файл можно запустить с помощью глобального запуска группа, например).
Связь между кодом UI и вашим сервисом может быть реализована с использованием любого механизма RPC: для этой цели особенно хорошо работают именованные каналы. Если ваши потребности в связи минимальны, использование определенных приложением команд Service Control Manager также может помочь.
Потребуются некоторые усилия, чтобы добиться такого разделения между пользовательским интерфейсом и служебным кодом: однако, это единственный способ заставить все работать надежно и хорошо послужит вам в будущем.
ADDENDUM, апрель 2010 г .: Поскольку этот вопрос остается довольно популярным, есть способ исправить еще один распространенный сценарий, который вызывает ошибки «служба не отвечает ...», включая службы .NET, которые не попробуйте любые забавные вещи, такие как взаимодействие с рабочим столом, но do используйте сборки с подписью Authenticode: отключите проверку подписи Authenticode во время загрузки, чтобы создать свидетельство Publisher , добавив следующее элементов в ваш файл .exe.config:
<configuration>
<runtime>
<generatePublisherEvidence enabled="false"/>
</runtime>
</configuration>
Свидетельство издателя - это малоиспользуемая функция безопасности доступа к коду (CAS): только в маловероятном случае, если ваша служба фактически использует PublisherMembershipCondition, отключение приведет к возникновению проблем. Во всех других случаях это устранит постоянные или периодические сбои при запуске, больше не требуя от среды выполнения дорогостоящих проверок сертификатов (включая поиск в списке отзыва).