Подтвердить что ты не робот

Служба Windows не запустится (ошибка 1053)

У меня есть служба Windows, которую я пытаюсь отлаживать. Теперь он не запускается, даже если текущий код работал. Ошибка:

Windows не удалось запустить службу MyService на локальном компьютере

Ошибка 1053: служба не ответила на запуск или управление запросить своевременно.

Чтобы изолировать ошибку, я попытался прокомментировать все. Основной метод выглядит следующим образом:

TextWriter tt = new StreamWriter(@"C:\startup.text", true);
tt.WriteLine("Starting up the service");
tt.Close();

ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] 
   { 
       new MyService()
   };

TextWriter tt2 = new StreamWriter(@"C:\startup.text", true);
tt2.WriteLine("Run...");
tt2.Close();

Он печатает как "запуск службы", так и "Run..." в файл журнала. Я также удалил внутреннюю часть MyService, чтобы он был пуст. Существует попытка/уловка вокруг любого кода, который теперь сводится к некоторым строкам журналов, как указано выше. Я никогда не вхожу в оператор catch, который бы зарегистрировал его.

Все в OnStart закомментировано:

protected override void OnStart(string[] args)
{
}

Таким образом, я в основном из идей. Я думал, что ошибка была вызвана тем, что метод Start никогда не заканчивается (или не в течение 30 секунд). Есть ли другой метод, который называется? Любые идеи приветствуются.

Дополнительная информация: Конструктор в MyService пуст. Если я вставляю некоторые строки Thread.Sleep(5000), тогда требуется больше времени, чтобы появилось сообщение об ошибке "Ошибка 1053". Основной метод, похоже, должен выйти (без ошибок).

4b9b3361

Ответ 1

Вам не хватает ServiceBase.Run call:

ServiceBase[] servicesToRun = new ServiceBase[]
                                { 
                                    new MyService() 
                                };
ServiceBase.Run(servicesToRun);

Также может быть хорошей идеей подписаться на необработанное уведомление об исключениях:

static void Main() {
    ...
    AppDomain.CurrentDomain.UnhandledException 
                                      += CurrentDomain_UnhandledException;
    ...
}

private static void CurrentDomain_UnhandledException(
                                                 Object sender, 
                                                 UnhandledExceptionEventArgs e) {

    if (e != null && e.ExceptionObject != null) {
        // log exception:
    }
}

И добавьте следующий try/catch в OnStart, потому что .NET/SCM проглатывает исключения:

protected override void OnStart(String[] args) {
    try {

    } catch(Exception e) {
        // log exception:
        throw;
    }
}