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