转自:https://www.cnblogs.com/Tpf386/p/11459775.html 
原文地址:https://jingyan.baidu.com/article/456c463b18e1b00a583144b3.html 

第一种:

附加到进程

1,首先要对服务进行安装,然后启动服务,如下图所示:C#开发windows服务如何调试——资料整理-LMLPHP

 2,打开VS项目,选择菜单 调试->附加到进程 选项,如下图所示:
C#开发windows服务如何调试——资料整理-LMLPHP
3,选择服务进程(如果找不到可以勾选 显示所有用户进程 选项)就可以了,找到服务对应的exe程序,如下图所示:

 4,在附加到进程的同时 OnStart 函数已经执行完毕,所以对 Onstart 无法调试。这个可以通过设置启动服务延时来加载调试,只需要在计时器Timer初始化的时候,传递一个参数即可,如下图所示:
C#开发windows服务如何调试——资料整理-LMLPHP

5,

注意:正常服务的启动时间为30秒左右,当服务启动时间超过30秒会报错!

 所以不要在OnStart中做过多的操作,也可以用这种延时的方法启动服务,以防在启动服务时超时。

 

第二种:

修改源代码(推荐)

找到服务主类中的OnStart方法,由


  1. protected override void OnStart(string[] args)

  2. {

  3.   //todo something

  4. }
修改成

  1. public void OnStart()

  2. {

  3.    //todo something

  4. }
如下图所示:
C#开发windows服务如何调试——资料整理-LMLPHP

注释掉Program.cs文件中的如下代码:

  1. ServiceBase[] ServicesToRun;

  2. ServicesToRun = new ServiceBase[]

  3. {

  4. new Service1()

  5. };

  6. ServiceBase.Run(ServicesToRun);

  7. //修改成

  8. Service1 s1 = new Service1();

  9. s1.OnStart();

C#开发windows服务如何调试——资料整理-LMLPHP

 在OnStart方法中利用F9打断点,然后按下F5就可以进行调试跟踪代码了,如下图所示:
C#开发windows服务如何调试——资料整理-LMLPHP

 注意:调试时,需要将先前启动的服务首先停止。程序代码编写调试完成后,记得将第1和2步骤的修改还原即可。

 

 

--------------------------------------------------

其他参考文章:

文章:Windows服务二:测试新建的服务、调试Windows服务

内容记录日志的地方很有借鉴意义。

 

文章:https://www.cnblogs.com/dotnet261010/p/6179480.html

文章标题:Windows服务一:新建Windows服务、安装、卸载服务

文章很好的介绍了如何新建和安装服务,当然还有卸载。

安装部分很有借鉴意义,提供了多种方法。

 

 微软资料:https://docs.microsoft.com/zh-cn/dotnet/framework/windows-services/how-to-debug-windows-service-applications

路径:

标题:如何:调试 Windows 服务应用程序

 

文章:C# windows服务的创建与调试

比较全面简洁。

 

文章:c#写windows服务

示例代码很好,不过具体细节不详细应该都能看懂。

作者的文章有很多赞同。

 

文章:调试windows服务最简单的方法之一

很好用的方法。

代码示例:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.ServiceProcess;
  5. using System.Text;

  6. namespace WindowsService1
  7. {
  8.     static class Program
  9.     {
  10.         ///
  11.         static void Main()
  12.         {
  13.             Service1 s = new Service1();

  14.             if (Environment.UserInteractive)
  15.             {
  16.                 s.DebugStart();

  17.                 Console.ReadKey();

  18.                 s.DebugStop();
  19.             }
  20.             else
  21.             {
  22.                 ServiceBase[] ServicesToRun;
  23.                 ServicesToRun = new ServiceBase[] { s };
  24.                 ServiceBase.Run(ServicesToRun);
  25.             }
  26.         }
  27.     }
  28. }

关键就在对Environment.UserInteractive的判断上,

请看MSDN上面的解释:

获取一个值,用以指示当前进程是否在用户交互模式中运行。

UserInteractive 属性为运行时无用户界面的 Windows 进程或一个服务(如 IIS)报告 false。 如果此属性为 false,请不要显示模式对话框或消息框,因为没有用来与用户进行交互的图形用户界面。

http://msdn.microsoft.com/zh-cn/library/system.environment.userinteractive(v=VS.100).aspx

然后看一下Service1.cs中的代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Diagnostics;
  6. using System.Linq;
  7. using System.ServiceProcess;
  8. using System.Text;

  9. namespace WindowsService1
  10. {
  11.     public partial class Service1 : ServiceBase
  12.     {
  13.         public Service1()
  14.         {
  15.             InitializeComponent();
  16.         }

  17.         protected override void OnStart(string[] args)
  18.         {
  19.             this.ServiceStart();
  20.         }

  21.         protected override void OnStop()
  22.         {
  23.             this.ServiceStop();
  24.         }

  25.         internal void DebugStart()
  26.         {
  27.             this.ServiceStart();
  28.         }

  29.         internal void DebugStop()
  30.         {
  31.             this.ServiceStop();
  32.         }

  33.         private void ServiceStart()
  34.         {
  35.             // TODO:

  36.         }

  37.         private void ServiceStop()
  38.         {
  39.             // TODO:
  40.         }



  41.     }
  42. }

最后:更改Project的输出类型

右击该Project,点击Properties,在Application标签中,更改Output Type为Console Application。

OK啦,按F5试试


09-05 01:23
查看更多