Windows服务调试小结(附Demo)
本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作。
阅读目录
本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作。
介绍
有时候不可避免的要建些Windows服务。既然写代码,就需要调试,由于这个东西搞的人不多,每个人调试的方法也不全,所以在下在这里小结一下调试方法。
搭建环境
一:创建一个Window Service
文件->新建项目->Windows 服务。
然后我们直接运行试试,然后提示如下:
好吧,我们就依他的意思,加个服务安装程序和些相关的引用及其他,结果如下:
这样我们的环境就基本搭建好了,然后就是服务的安装,运行bin\Debug\Install\install.bat即可。
调试方式
一:普通调试
msdn上指出“必须从服务控制管理器的上下文中而不是 Visual Studio 中运行服务。 因此,调试服务不像调试其他 Visual Studio 应用程序类型一样简单。 要调试服务,必须启动该服务,然后将调试器附加到该服务正在其中运行的进程中。 然后你可以使用所有 Visual Studio 的标准调试功能来调试你的应用程序”。
所以我们启动服务,然后通过vs附件该服务进程,然后就可以调试了。如下:
二:特殊调试
如果我们不想创建服务就想调试代码,其实可以采用其他的替代方式进行,只不过要改代码。
我们找到程序的入口:Program.cs。
原代码如下:
1 static class Program 2 { 3 /// <summary> 4 /// 应用程序的主入口点。 5 /// </summary> 6 static void Main() 7 { 8 ServiceBase[] ServicesToRun; 9 ServicesToRun = new ServiceBase[] 10 { 11 new ServiceDebug() 12 }; 13 ServiceBase.Run(ServicesToRun); 14 } 15 }
修改后代码如下:
1 protected override void OnStart(string[] args) 2 { 3 Timer timer = new Timer(); 4 timer.Interval = 1000; 5 timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); 6 timer.Start(); 7 8 } 9 10 private void timer_Elapsed(object sender, ElapsedEventArgs e) 11 { 12 13 } 14 15 protected override void OnStop() 16 { 17 } 18 19 public void Test(string[] args) 20 { 21 OnStart(args); 22 }
1 static class Program 2 { 3 /// <summary> 4 /// 应用程序的主入口点。 5 /// </summary> 6 static void Main() 7 { 8 ServiceDebug service = new ServiceDebug(); 9 service.Test(null); 10 11 while (true) 12 { 13 System.Threading.Thread.Sleep(1000); 14 } 15 return; 16 17 ServiceBase[] ServicesToRun; 18 ServicesToRun = new ServiceBase[] 19 { 20 new ServiceDebug() 21 }; 22 ServiceBase.Run(ServicesToRun); 23 } 24 }
这样,我们就可以进行调试了。
二:OnStart常规调试
有时候我们想正常的调试Onstart方法,但是,启动服务后这个方法已经运行了,那么我们应该怎么调试捏。
我们可以在Onstart方法体前面加个Debugger.Launch();就可以很愉快的调试了。如下:
1 protected override void OnStart(string[] args) 2 { 3 Debugger.Launch(); 4 5 Timer timer = new Timer(); 6 timer.Interval = 1000; 7 timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); 8 timer.Start(); 9 10 }
启动服务后弹出如下:,然后选中对应的解决方案即可。
Demo下载
本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作。



【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
2013-12-04 IP地址(IPv4)/IPv6地址的正则表达式