由于当您尝试使用以下命令从命令行启动服务时,您的服务就会启动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);
}
将此代码添加到您的服务后,重新部署它,重新启动系统,然后检查事件日志。至少您应该在服务启动时看到一条记录的消息。