我正在尝试启动我的调试版本WindowsService
,但我收到的错误是它没有及时启动。
我已经清理了ctor和OnStart
,但它仍然无法启动所以我想也许它加载的DLL需要更好地安装,而不是仅仅在我的项目目录的调试目录中。也许main()
中的所有碰撞都悬挂在干燥?
任何调试服务的指针?我无法直接在VStudio中运行它,因为很明显,它不允许进入其OnCustomCommand(int cmd)
成员并在那里打破它。
答案 0 :(得分:2)
如果我理解正确,您希望能够在服务处于空闲“已启动”状态之前对其进行调试吗?
您可以使用Debugger.Break()功能。例如,我们经常在调试版本中将以下内容放入Main函数中:
#if DEBUG
if (!Debugger.IsAttached)
{
Debugger.Break();
}
#endif
答案 1 :(得分:1)
我只会在OnStart方法中尽可能少地执行,足够的init启动完成所有工作的线程,因此您可以尽快从OnStart返回。然后在线程委托中,您可以添加Reddog的代码以打入调试器,可能在那里使用thread.sleep,这样它就可以让您有时间首先附加到进程。
另一种方法是向您的服务添加一个main方法,它可以创建服务类的实例并调用onstart / onstop,并将项目输出更改为控制台应用程序,然后您将获得两全其美的优势,它' ll作为服务通过installutil安装,你可以运行它并在visual studio中作为控制台应用程序进行调试。
详情here
如果你想只将服务调试为服务,那么我建议你的OnStart方法启动一个执行处理然后返回的线程,然后线程委托可以做一个Thread.Sleep(一段合理的时间) )然后Debugger.Break();
线程休眠使您有机会将调试器附加到进程,在使用服务控制管理器启动服务后,它会进入Debugger.Break(),这将强制调试器中断,允许您一小步。关键是在30秒之前从OnStart返回,并在遇到断点之前将调试器附加到进程。
另外,我认为Debugger.Break为您提供了附加调试器的选项,因此请在代码中尝试(不确定它是否可以很好地与服务一起使用,因为它们应该没有UI),您可能会因为坚持Debugger.Break到您的委托并在30秒之前附加到该过程。