我正在查看几篇文章以了解如何调试 Windows 服务。我发现如果我将以下代码放入我的OnStart()
函数中:
Debugger.Launch();
可以解决问题,但是在我通过 CMD(NET START)启动我的 windows 服务后,它只是启动并正常运行,但调试器永远不会启动,即使 VS 是使用加载的 windows 服务打开的。
我觉得我错过了什么,这是什么?
我正在查看几篇文章以了解如何调试 Windows 服务。我发现如果我将以下代码放入我的OnStart()
函数中:
Debugger.Launch();
可以解决问题,但是在我通过 CMD(NET START)启动我的 windows 服务后,它只是启动并正常运行,但调试器永远不会启动,即使 VS 是使用加载的 windows 服务打开的。
我觉得我错过了什么,这是什么?
我通过修改服务的 Main 方法来做到这一点,它在 Program.cs 中,默认情况下它看起来像这样:
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new ServiceMain() };
ServiceBase.Run(ServicesToRun);
然后,您可以使用Environment.UserInteractive找出您的服务是否像服务或槽调试器一样启动:
if (!Environment.UserInteractive)
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new ServiceMain() };
ServiceBase.Run(ServicesToRun);
}
else
{
ServiceMain sm = new ServiceMain();
Console.Write("Service debug run");
sm.StartForDebugging();
}
当然,您必须在您的服务中添加 StartForDebugging 方法,并且与您在 OnStart 方法中所做的几乎相同,或者您可以直接调用 OnStart 方法只是将其公开。
您可以尝试将其包含在OnStart
方法中:
while(!System.Diagnostics.Debugger.IsAttached)
{
System.Threading.Thread.Sleep(100);
}
然后,从 Visual Studio 菜单手动附加到进程:Debug -> Attach to Process。
另外,请注意,在Debugger.Launch Method主题的备注部分中声明:
如果已附加调试器,则不会发生任何事情。