如何在Visual Studio中调试Windows服务

时间:2018-03-28 22:20:57

标签: c# windows service

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

我首先根据教程编写了一个简单的C#服务'CronService'。我有它的工作,但希望能够在VS2017中进行调试。我之前通过加载DLL,在代码中设置断点然后执行“Run with debug”调试了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(),您可以从上面的链接中获取该函数。此方法使用Reflection来调用OnStart()和OnStop()。

您仍然需要以正常方式编译,安装和启动服务。要进行调试,请执行以下步骤: -

  1. 在VS2017中打开项目

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

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

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

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

  4. [>]从调试开始

    断点将被击中!

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

1 个答案:

答案 0 :(得分:0)

有一种方法。我不知道它适用于Windows服务 在您想要开始调试的代码中添加一些位置

System.Diagnostics.Debugger.Launch();

之后,您可以通过服务经理或任何其他方式开始您的服务。 比你有一个选择debuger的承诺。选择已打开项目的Visual Studio实例。

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