Как решить проблему «CS8805: Программа, использующая верхний уровень..» VS «1053: Служба не ответила..»?

Когда тип вывода установлен на «Приложение Windows» или «Консольное приложение», служба не может быть запущена и выдает ошибку «1053: Служба не ответила на запрос запуска или управления своевременно». Копаясь за этим, я обнаружил, что это связано с тем, что Windows 10 (+ новые версии сервера Windows) не допускает интеграцию с пользовательским интерфейсом (нулевой сеанс) без запущенной службы «Обнаружение интерактивных служб», а это не разрешено в Windows 10.

Попытка решить эту проблему, используя вместо этого тип вывода «Библиотека классов», приводит к ошибке сборки «CS8805: программа, использующая операторы верхнего уровня, должна быть исполняемым файлом». Я читал несколько статей, в которых говорилось, что это может быть связано с двойной точкой с запятой где-то, но я не нашел ничего подобного в исходных файлах.

Итак, как мне создать рабочую службу, которая работает на Windows 10 и новых серверах Windows?

2 ответа

Вы должны указать тип вывода в вашем файле .csproj, добавив:

      <PropertyGroup>
...
    <OutputType>Exe</OutputType>
    <_FunctionsSkipCleanOutput>true</_FunctionsSkipCleanOutput>
...
</PropertyGroup>

Служба может быть консольной или GUI .exe, это не имеет значения. Однако он ДОЛЖЕН вызывать сервисный API при запуске:

Когда диспетчер управления службами запускает процесс службы, он ожидает, пока процесс вызовет StartServiceCtrlDispatcherфункция. Основной поток сервисного процесса должен сделать этот вызов как можно скорее после его запуска (в течение 30 секунд).

Подробнее о сервисах и смотрите примеры на MSDN...

Интерактивные службы устарели, начиная с Vista, но некоторая совместимость все еще сохранялась некоторое время. Это время закончилось, вам просто нужно написать сервис и вспомогательное приложение, которое запускается в сеансе пользователя.

Другие вопросы по тегам