【问题标题】:How to Debug a Windows Service in Visual Studio如何在 Visual Studio 中调试 Windows 服务
【发布时间】:2026-01-09 09:25:02
【问题描述】:

我正在编写一个 C# Windows 服务来管理两个系统服务,这将有助于防止 Microsoft 将 W10AU(周年更新)升级到 W10CU(创作者更新)。最近微软“犯了一个错误”并强制从 v1607 更新到 v17xx,即使用户有计量连接并且已禁用、延迟或阻止更新。

我首先根据教程编写了一个简单的 C# 服务“CronService”。我有它的工作,但希望能够在 VS2017 中调试。我之前通过加载 DLL、在代码中设置断点然后执行“使用调试运行”来调试 DLL。这更难。

https://docs.microsoft.com/en-us/dotnet/framework/windows-services/how-to-debug-windows-service-applications

这并不像看起来那么容易!如果您按照上述说明进行操作,您会发现所有断点都被禁用“断点不会被命中。符号未加载。”如果你进一步看,你会发现你必须通过编写另一个虚拟服务来跳过箍??

Easier way to debug a Windows service

按照对我有用的建议之一。而不是

    public static void Main() {
        ServiceBase.Run(new CronService());
    }

您将 Main() 编码为

    public static void Main() {
        if (Environment.UserInteractive) {
            RunInteractive(new CronService());
        } else {
            ServiceBase.Run(new CronService());
        }
    }

然后添加一个函数 RunInteractive() ,您可以从上面的链接中获得它。此方法使用反射来调用 OnStart() 和 OnStop()。

您仍然需要以正常方式编译、安装和启动服务。要调试,请按照下列步骤操作:-

  1. 在 VS2017 中打开项目

  2. 从 cmd 行启动 cron.exe;该服务应该正在运行

    cmd窗口会提示“按任意键停止服务”

  3. 设置断点;他们没有被禁用!

    你甚至可以在 OnStart() 和 OnStop() 中设置断点

  4. [>] 从调试开始

    断点会被命中!

  5. 在 cmd 窗口中按任意键停止调试

【问题讨论】:

  • 这里有实际问题吗?

标签: c# windows service


【解决方案1】:

还有另一种方式。我不知道它是否适用于 Windows 服务。
将一些地方放在你想要开始调试的代码中

System.Diagnostics.Debugger.Launch();

之后,您可以通过服务管理器或您通常执行此操作的任何其他方式启动您的服务。 比你将有一个选择调试器的提示。选择一个已打开项目的 Visual Studio 实例。

在您使用管理员权限启动 Visual Studio 之前,您可能看不到它的实例。

【讨论】: