Так как ваша служба запускается, когда вы пытаетесь запустить ее из командной строки, используя net.exe start [ServiceName]
, но не запускается при запуске Windows, возможно, она сталкивается с исключением во время запуска.
При создании и работе с пользовательской службой Windows важно отметить, что журнал событий Windows может быть очень полезен для отслеживания проблем. При возникновении ошибок в службе стоит зарегистрировать эту ошибку в журнале событий.
Еще одно полезное средство для отладки работающей службы в Visual Studio - это запустить службу и подключить к ней отладчик VS.
Для того, чтобы войти в ваш журнал событий Windows, я предлагаю изменить код вашего сервиса для регистрации его запуска. Обратите внимание, что то, что я здесь опубликовал, упрощено для этого форума - я обычно помещаю весь код регистрации в отдельный класс. Таким образом, я могу использовать его в течение всего срока службы. Одно важное замечание - обязательно установите свойство ServiceName
вашего основного класса обслуживания с соответствующим именем - это должно быть сделано в Visual Studio во время разработки в окне «Свойства» конструктора служб.
private EventLog _eventLog;
/*
* Use the EventId enumeration to store event IDs that will be written with events
* to the Windows event log.
*/
enum EventId
{
ServiceStarting = 10,
ServiceStartNormal = 100,
ServiceStartFailure = 999;
}
protected override void OnStart(string[] args)
{
try
{
// remember the event log
_eventLog = EventLog;
// log start
LogMessage(_eventLog, "Service starting", EventLogEntryType.Information, EventId.ServiceStarting);
filePath = configReader.ReadConfig("FilePath");
DateEvent dateEvent = new DateEvent(DateTime.Now, TimeLoggerCore.Events.STARTUP.ToString());
writer.WriteToFile(dateEvent, filePath, true, false);
LogMessage(_eventLog, "Service started", EventLogEntryType.Information, EventId.ServiceStartNormal);
}
catch(Exception e)
{
LogMessage(_eventLog, e.ToString(), EventLogEntryType.Error, EventId.ServiceStartFailure);
}
}
private static void LogMessage(EventLog eventLog, string message, EventLogEntryType entryType, EventId eventId)
{
/*
* If the event source we want to log doesn't exist, create it.
* Note that this take admin privs, and creating the log source should be
* done during service installation. This is here as a secondary means
* to create the log in the event that it doesn't already exist.
*/
if (!EventLog.SourceExists(eventLog.Source)
{
EventLog.CreateEventSource(eventLog.Source, eventLog.Log);
}
eventLog.WriteEntry(message, entryType, (int) eventId);
}
После добавления этого кода в службу повторно разверните его, перезапустите систему и проверьте журнал событий. Как минимум, вы должны увидеть сообщение, зарегистрированное при запуске службы.