Windows服务启动报Error 1064,求助事件日志监控服务故障排查
排查Windows服务Error 1064异常的步骤
Error 1064表明服务的OnStart方法中抛出了未处理的异常,结合你的代码,按以下步骤逐一排查:
1. 修正ServiceName的设置时机
不要在OnStart或Main中动态修改ServiceName,Windows服务的名称需要在构造函数中初始化,系统启动服务时会依赖该名称进行识别,动态修改会引发控制请求处理异常。
修改构造函数:
public wumed() { this.ServiceName = "Wumed"; // 其他初始化逻辑 }
同时删除OnStart和Main中设置ServiceName的代码。
2. 移除Console.WriteLine调用
Windows服务运行在非交互式会话环境,没有控制台窗口,调用Console.WriteLine会触发IO异常。改用EventLog记录服务状态:
// 构造函数中初始化EventLog public wumed() { this.ServiceName = "Wumed"; if (!EventLog.SourceExists("WumedService")) { EventLog.CreateEventSource("WumedService", "Application"); } EventLog.Source = "WumedService"; EventLog.Log = "Application"; } protected override void OnStart(string[] args) { try { EventLog.WriteEntry("服务已启动", EventLogEntryType.Information); EventLogSubscription(); } catch (Exception ex) { EventLog.WriteEntry($"启动失败:{ex.Message}\n{ex.StackTrace}", EventLogEntryType.Error); throw; // 抛出异常让系统捕获,同时留存详细错误日志 } } protected override void OnStop() { EventLog.WriteEntry("服务已停止", EventLogEntryType.Information); _watcher?.Dispose(); base.OnStop(); }
3. 重点排查EventLogSubscription()方法
这是最可能引发异常的核心逻辑,需确认:
- 读取目标事件日志的权限是否足够(管理员权限通常满足,但要核对日志名称/路径正确)
- 事件订阅代码是否存在未处理的异常(比如找不到指定日志、事件源不存在、
EventLogWatcher初始化错误) - 是否存在空引用或参数错误
4. 调试获取详细错误信息
- 交互式调试:在
OnStart开头添加Debugger.Launch();,启动服务时会弹出调试器选择窗口,附加进程后逐行执行,定位报错代码。 - 查看系统日志:打开事件查看器,在「Windows日志-应用程序」中查找
WumedService写入的错误日志,里面包含具体的异常栈信息。
5. 检查服务安装配置
如果通过安装程序部署服务,需确认:
- 服务启动账户拥有足够权限
- 安装时配置的服务名称与代码中
ServiceName一致
内容的提问来源于stack exchange,提问作者Ferhat Özgür KILIÇ
相关产品推荐
相关产品推荐

