C# Windows Service服务的创建和调试

前言

  关于Windows服务创建和调试的文章在网络上的很多文章里面都有,直接拿过来贴在这里也不过仅仅是个记录,不会让人加深印象。所以本着能够更深刻了解服务项目的创建和调试过程及方法的目的,有了这篇记录。

目录

一、什么是Windows Service服务?

二、基于C#的Windows Service服务的创建、安装、卸载?

三、Windows Service服务开发过程中如何调试代码?

正文

一、什么是Windows Service服务?

  Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这使服务非常适合在服务器上使 用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上 下文中运行服务。(百度百科)

二、基于C#的Windows Service服务的创建、安装、卸载?

  1、打开:Visual Studio 2010 => 新建 => 项目 => Windows 服务,如图:

  

  步骤:3.设置项目名称    4.设置项目文件夹所在磁盘位置

  2、重命名Service1.cs文件名为容易识别功能的文件名,这里我重命名成 MyFirstWinService.cs 。 在此文件的设计视图中右键,在弹出的菜单中选择添加安装程序。

  

  3、项目会自动生成安装文件 ProjectInstaller.cs ,并且分别设置 serviceIntaller1 与 serviceProcessInstaller1 的属性。

  

  

  到这里,服务的安装程序与框架已经搭建完毕,然后就在服务类 MyFirstWinService.cs 的代码视图中编写自己的业务代码即可,如下面的代码。

  4、服务类 MyFirstWinService.cs 内的代码

 1 using System;
 2 using System.ServiceProcess;
 3
 4 namespace WindowsServiceTest
 5 {
 6     public partial class MyFirstWinService : ServiceBase
 7     {
 8         public MyFirstWinService()
 9         {
10             InitializeComponent();
11         }
12
13         protected override void OnStart(string[] args)
14         {
15             string str = "服务开启";
16             TestClass.WriteMsgToFile(@"E:\MyProjects\WSExample.txt", str + ",时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
17         }
18
19         protected override void OnStop()
20         {
21             string str = "服务停止";
22             TestClass.WriteMsgToFile(@"E:\MyProjects\WSExample.txt", str + ",时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
23         }
24
25         protected override void OnContinue()
26         {
27             string str = "服务继续运行";
28             TestClass.WriteMsgToFile(@"E:\MyProjects\WSExample.txt", str + ",时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
29         }
30
31         protected override void OnPause()
32         {
33             string str = "服务暂停";
34             TestClass.WriteMsgToFile(@"E:\MyProjects\WSExample.txt", str + ",时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
35         }
36     }
37
38     public static class TestClass
39     {
40         public static void WriteMsgToFile(string fileName, string content)
41         {
42             using (System.IO.StreamWriter sw = new System.IO.StreamWriter(fileName, true))
43             {
44                 sw.WriteLine(content);
45             }
46         }
47     }
48 }

  5、在上面的步骤中,已经完成了服务的开发工作。接下来就是服务的安装过程:

  1)安装服务的CMD命令:%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe WindowsServiceTest.exe

  2)卸载服务的CMD命令:%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u WindowsServiceTest.exe

   不过在这里我把命令操作写成两个批处理文件:

Install.bat

%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe WindowsServiceTest.exe
Net Start ServiceTest

Uninstall.bat

net stop ServiceTest
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u WindowsServiceTest.exe

  将批处理文件放入项目的bin->Debug文件夹下面,这样就可以方便安装和卸载服务了。当然,写成批处理文件,也方便使用程序控制服务的安装和卸载。

  

三、Windows Service服务开发过程中如何调试代码?

  对于有一定C#基础的初学者来说,使用Visual Studio创建并完成一个简单的服务程序,相对来说还是比较容易的。但是对于如何调试Windows服务程序,还是比较麻烦的。主要是Windows服务程序没有办法像其他Windows程序一样直接在代码里面设置断点,按F5来启动代码调试。

  经过查找资料,并亲自进行调试之后,得出三个方法:

方法1:写日志
  这是最传统的调试方法,也是很多程序开发调试代码很常见的。只是这个方法不能实时观察数据在代码里面的变化,只能在你认为可能出现错误的地方添加写日志的方法,把数据变化过程记录下来。

方法2:附加进程
  这是Windows服务开发常用的调试方式。此方法必须先把写好的服务进行编译生成可执行的exe安装程序,并安装启动服务后,才可以进行附加此服务进程。
  1、首先要对服务进行安装,然后启动服务。
  2、打开VS项目,选择菜单 调试->附加到进程 选项,选择你的服务进程(如果找不到可以勾选 显示所有用户进程 选项)就可以了。如下图:

  

  这里有一个问题:就是在附加到进程的同时 OnStart 函数已经执行完毕,所以对 Onstart 无法调试。这个可以通过设置启动服务延时来加载调试。

        private System.Timers.Timer timerDelay;
        protected override void OnStart(string[] args)
        {
            try
            {
                ///delay start the SynData 30seconds
                timerDelay = new System.Timers.Timer(30000);
                timerDelay.Elapsed += new System.Timers.ElapsedEventHandler(timerDelay_Elapsed);
                timerDelay.Start();
            }
            catch (Exception ex)
            {
                this.PrintExceptions(ex);
            }
        }

        void timerDelay_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            timerDelay.Enabled = false;
            timerDelay.Close();

            //你要加的代码
            string str = "服务开启";
            TestClass.WriteMsgToFile(FilePath, str + ",时间:" + DateTime.Now.ToString(DateFormat));
        }

  注意:正常服务的启动时间为30秒左右,当服务启动时间超过30秒会报错!,所以不要在OnStart中做过多的操作,也可以用这种延时的方法启动服务,以防在启动服务时超时。

方法3:修改Main函数中的起始代码
  这是一个取巧的方法,在Main函数中,注释掉原有自动生成的代码,手动实例化所写的服务类。如下代码中红色部分:

static class Program
     {
         /// <summary>
         /// 应用程序的主入口点。
         /// </summary>
         static void Main()
         {
             //ServiceBase[] ServicesToRun;
             //ServicesToRun = new ServiceBase[]
             //{
             //    new ServiceTest()
             //};
             //ServiceBase.Run(ServicesToRun);

ServiceTest st = new ServiceTest(); //ServiceTest为自己建的服务类
             st.OnStart();
         }
     }

  然后需要把ServiceTest类中的 protected override void OnStart(string[] args)修改为 public void OnStart(),接着就可以在OnStart()方法里面设置断点,按F5运行调试了。

public void OnStart()
        {
            string str = "服务开启";
            TestClass.WriteMsgToFile(FilePath, str + ",时间:" + DateTime.Now.ToString(DateFormat));
            //Code Something......
        }

  ServiceTest类中的其他方法也可以这样进行调试,待调试完毕后,把方法再修改回原来的样子既可。

一点补充:

1)Service启动属性:

Manual      服务安装后,必须手动启动。

Automatic    每次计算机重新启动时,服务都会自动启动。

Disabled     服务无法启动。

2)新建的Service项目,其中各属性的含义(服务类 MyFirstWinService.cs 设计视图->右键属性):

Autolog   是否自动写入系统的日志文件

CanHandlePowerEvent   服务时候接受电源事件

CanPauseAndContinue   服务是否接受暂停或继续运行的请求

CanShutdown   服务是否在运行它的计算机关闭时收到通知,以便能够调用 OnShutDown 过程

CanStop   服务是否接受停止运行的请求

ServiceName   服务名

3) 也可以在系统服务管理器中,设置相应Service的属性或启动方式等

计算机管理 -> 服务和应用程序  -> 服务  -> ...

  这些只是我目前知道的调试方法,当然肯定还有,有时候还需要多种方法结合着来调试。

时间: 2024-08-18 02:40:26

C# Windows Service服务的创建和调试的相关文章

C# windows服务的创建与调试(转)

Windows Service这一块并不复杂,但是注意事项太多了,网上资料也很凌乱,偶尔自己写也会丢三落四的.所以本文也就产生了,本文不会写复杂的东西,完全以基础应用的需求来写,所以不会对Windows Service写很深入. 本文介绍了如何用C#创建.安装.启动.监控.卸载简单的Windows Service 的内容步骤和注意事项. 一.创建一个Windows Service 1)创建Windows Service项目 2)对Service重命名 将Service1重命名为你服务名称,这里我

C#制作Windows service服务系列二:演示一个定期执行的windows服务及调试(windows service)

系列一: 制作一个可安装.可启动.可停止.可卸载的Windows service(downmoon原创) 系列二:演示一个定期执行的windows服务及调试(windows service)(downmoon) 系列三: windows service系列三--制作可控制界面的windows service 一.经常有人问起如何让程序定期自动执行? 除了像系统任务和SQL JOB/DTS等都可以满足不同的用户需求外,这里演示了如何做一个简单的windows serivce的框架.主要的功能是按照

.Net Windows Service(服务) 调试安装及System.Timers.Timer 使用

Windows Service(服务)  是运行在后台的进程 1.VS建立 Windows 服务(.NET Framework) 2.添加Timer 双击Service1.cs可以拖控件(System.Windows.Forms.Timer)这儿注意命名空间哦, 双击 trmer1 生成事件,修改事件方法如下: App.config: <appSettings> <add key="TimerExecTime" value="0001-01-01 10:07

使用Windows Service Wrapper快速创建一个Windows Service 如nginx

前言 今天介绍一个小工具的使用.我们都知道Windows Service是一种特殊的应用程序,它的好处是可以一直在后台运行,相对来说,比较适合一些需要一直运行同时不需要过多用户干预的应用程序,这一类我们称之为"服务"吧 编写Windows Service其实是不难的,尤其是如果有Visual Studio的话.但是仍然是有不少童鞋觉得略显繁琐,同时,如果有一些其他的程序,我们只拿到一个exe,或者一个bat,但又想让他象服务一样运行,怎么办呢 答案就是可以使用如下的一个工具,它的名称就

使用Windows Service Wrapper快速创建一个Windows Service

前言 今天介绍一个小工具的使用.我们都知道Windows Service是一种特殊的应用程序,它的好处是可以一直在后台运行,相对来说,比较适合一些需要一直运行同时不需要过多用户干预的应用程序,这一类我们称之为"服务"吧 编写Windows Service其实是不难的,尤其是如果有Visual Studio的话.但是仍然是有不少童鞋觉得略显繁琐,同时,如果有一些其他的程序,我们只拿到一个exe,或者一个bat,但又想让他象服务一样运行,怎么办呢 答案就是可以使用如下的一个工具,它的名称就

[开发笔记]-Windows Service服务相关注意事项

注意一:报错:"本地计算机上的 *** 服务启动后停止.某些服务在未由其他服务或程序使用时将自动停止." 该问题主要的原因是 Service服务程序中有错误. 遇到这个问题时,无论是重新安装服务,还是重启计算机,每次启动时都会弹出这个错误提示框. 解决这种问题最好的办法就是:使用 控制台应用程序 来调试,等调试通过后,在加入到Service服务程序中. 注意二: 报错 :试图加载格式不正确的程序. 原因:程序集之间的通讯要么全是64位环境下的,要么全是32位环境下的.不能混编访问.不然

Visual Studio 2012的Windows Service服务安装方式

windows服务应用程序是一种长期运行在操作系统后台的程序,它对于服务器环境特别适合,它没有用户界面,不会产生任何可视输出,任何用户输出都回被写进windows事件日志.计算机启动时,服务会自动开始运行,他们不要用户一定登陆才运行. 可以通过选择菜单"开始"-〉"控制面板"-〉"系统和安全"-〉"管理工具" -〉"服务"来查看现有系统中的服务,如下图: 创建window 服务 新建一个window 服务项

C++ (Windows Service)服务编程

例子源码挂在github上,如有需要请clone : https://github.com/mox9378/Cpp-Simple-Windows-Service-Example 欢迎 C++/Python 的朋友一起交流学习, My QQ Number: 2303186535 以下附上相关结构体和函数的介绍: Struct SERVICE_STATUS结构定义了服务的运行状态/服务类型/接受的控制形式以及指定错误代码等 1 typedef struct _SERVICE_STATUS { 2 D

C#创建Windows Service(Windows 服务)基础教程

Windows Service这一块并不复杂,但是注意事项太多了,网上资料也很凌乱,偶尔自己写也会丢三落四的.所以本文也就产生了,本文不会写复杂的东西,完全以基础应用的需求来写,所以不会对Windows Service写很深入. 本文介绍了如何用C#创建.安装.启动.监控.卸载简单的Windows Service 的内容步骤和注意事项. 一.创建一个Windows Service 1)创建Windows Service项目 2)对Service重命名 将Service1重命名为你服务名称,这里我