我正在编写一个C#Windows服务来管理两个系统服务,这将有助于阻止Microsoft将W10AU(周年纪念更新)升级到W10CU(创建者更新)。最近微软“犯了一个错误”并强制从v1607更新到v17xx,即使用户有计量连接和已禁用或延迟或阻止更新。
我首先根据教程编写了一个简单的C#服务'CronService'。我有它的工作,但希望能够在VS2017中进行调试。我之前通过加载DLL,在代码中设置断点然后执行“Run with debug”调试了DLL。这更难。
这并不像看起来那么容易!如果您按照上述说明操作,您将发现所有断点都被禁用“断点不会被命中。符号未加载。”如果你进一步观察,你会发现你必须通过编写另一个虚拟服务来跳过箍,或者
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()。
您仍然需要以正常方式编译,安装和启动服务。要进行调试,请执行以下步骤: -
在VS2017中打开项目
从cmd行启动cron.exe;该服务应该正在运行
cmd窗口会显示“按任意键停止服务”
设置断点;他们没有被禁用!
你甚至可以在OnStart()和OnStop()中设置一个断点
[>]从调试开始
断点将被击中!
停止调试按cmd窗口中的任意键
答案 0 :(得分:0)
有一种方法。我不知道它适用于Windows服务 在您想要开始调试的代码中添加一些位置
System.Diagnostics.Debugger.Launch();
之后,您可以通过服务经理或任何其他方式开始您的服务。 比你有一个选择debuger的承诺。选择已打开项目的Visual Studio实例。
在使用管理员权限启动Visual Studio之前,您可能看不到它的实例。