Windows Service这一块并不复杂,但是注意事项太多了,网上资料也很凌乱,偶尔自己写也会丢三落四的。所以本文也就产生了,本文不会写复杂的东西,完全以基础应用的需求来写,所以不会对Windows Service写很深入。

本文介绍了如何用C#创建、安装、启动、监控、卸载简单的Windows Service 的内容步骤和注意事项。

一、创建一个Windows Service

1)创建Windows Service项目

2)对Service重命名

将Service1重命名为你服务名称,这里我们命名为ServiceTest。

二、创建服务安装程序

1)添加安装程序

之后我们可以看到上图,自动为我们创建了ProjectInstaller.cs以及2个安装的组件。

2)修改安装服务名

右键serviceInsraller1,选择属性,将ServiceName的值改为ServiceTest。

3)修改安装权限

右键serviceProcessInsraller1,选择属性,将Account的值改为LocalSystem。

三、写入服务代码

1)打开ServiceTest代码

右键ServiceTest,选择查看代码。

2)写入Service逻辑

添加如下代码:

  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.  
  10. namespace WindowsServiceTest
  11. {
  12. public partial class ServiceTest : ServiceBase
  13. {
  14. public ServiceTest()
  15. {
  16. InitializeComponent();
  17. }
  18.  
  19. protected override void OnStart(string[] args)
  20. {
  21. using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\log.txt", true))
  22. {
  23. sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Start.");
  24. }
  25. }
  26.  
  27. protected override void OnStop()
  28. {
  29. using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\log.txt", true))
  30. {
  31. sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Stop.");
  32. }
  33. }
  34. }
  35. }

这里我们的逻辑很简单,启动服务的时候写个日志,关闭的时候再写个日志。

四、创建安装脚本

在项目中添加2个文件如下(必须是ANSI或者UTF-8无BOM格式):

1)安装脚本Install.bat

  1. %SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe WindowsServiceTest.exe
  2. Net Start ServiceTest
  3. sc config ServiceTest start= auto

2)卸载脚本Uninstall.bat

  1. %SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u WindowsServiceTest.exe

3)安装脚本说明

第二行为启动服务。

第三行为设置服务为自动运行。

这2行视服务形式自行选择。

4)脚本调试

如果需要查看脚本运行状况,在脚本最后一行加入pause

五、在C#中对服务进行控制

0)配置目录结构

简历一个新WPF项目,叫WindowsServiceTestUI,添加对System.ServiceProcess的引用。

在WindowsServiceTestUI的bin\Debug目录下建立Service目录。

将WindowsServiceTest的生成目录设置为上面创建的Service目录。

生成后目录结构如下图

1)安装

安装时会产生目录问题,所以安装代码如下:

  1. string CurrentDirectory = System.Environment.CurrentDirectory;
  2. System.Environment.CurrentDirectory = CurrentDirectory + "\\Service";
  3. Process process = new Process();
  4. process.StartInfo.UseShellExecute = false;
  5. process.StartInfo.FileName = "Install.bat";
  6. process.StartInfo.CreateNoWindow = true;
  7. process.Start();
  8. System.Environment.CurrentDirectory = CurrentDirectory;

2)卸载

卸载时也会产生目录问题,所以卸载代码如下:

  1. string CurrentDirectory = System.Environment.CurrentDirectory;
  2. System.Environment.CurrentDirectory = CurrentDirectory + "\\Service";
  3. Process process = new Process();
  4. process.StartInfo.UseShellExecute = false;
  5. process.StartInfo.FileName = "Uninstall.bat";
  6. process.StartInfo.CreateNoWindow = true;
  7. process.Start();
  8. System.Environment.CurrentDirectory = CurrentDirectory;

3)启动

代码如下:

  1. using System.ServiceProcess;
  2.  
  3. ServiceController serviceController = new ServiceController("ServiceTest");
  4. serviceController.Start();

4)停止

  1. ServiceController serviceController = new ServiceController("ServiceTest");
  2. if (serviceController.CanStop)
  3. serviceController.Stop();

5)暂停/继续

  1. ServiceController serviceController = new ServiceController("ServiceTest");
  2. if (serviceController.CanPauseAndContinue)
  3. {
  4. if (serviceController.Status == ServiceControllerStatus.Running)
  5. serviceController.Pause();
  6. else if (serviceController.Status == ServiceControllerStatus.Paused)
  7. serviceController.Continue();
  8. }

6)检查状态

  1. ServiceController serviceController = new ServiceController("ServiceTest");
  2. string Status = serviceController.Status.ToString();

六、调试Windows Service

1)安装并运行服务

2)附加进程

3)在代码中加入断点进行调试

七、总结

本文对Windows service的上述配置都未做详细解释,但是按上述步骤就可以制作可运行的Windows Service,从而达到了工作的需求。

C#编写Windows服务程序图文教程(转载)的更多相关文章

  1. C#编写Windows服务程序图文教程

    安装服务程序C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe  要安装的服务程序路径(如F:\***.exe)卸载服务程序C: ...

  2. C语言编写Windows服务程序

    原文:C语言编写Windows服务程序 #include <Windows.h> #include <stdio.h> #define SLEEP_TIME 5000 // 间 ...

  3. Github for Windows使用图文教程_西西软件资讯

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  4. 编写windows服务程序

    2012-11-02 08:54 (分类:计算机程序) windows服务是一个运行在后台并实现勿需用户交互的任务的控制台程序,对于隐藏程序有很大帮助. 用了几天时间概括了编写windows服务程序的 ...

  5. C# 编写Windows Service(windows服务程序)【转载】

    [转]http://www.cnblogs.com/bluestorm/p/3510398.html Windows Service简介: 一个Windows服务程序是在Windows操作系统下能完成 ...

  6. 用 C 语言编写 Windows 服务程序的五个步骤

    Windows 服务被设计用于需要在后台运行的应用程序以及实现没有用户交互的任务.为了学习这种控制台应用程序的基础知识,C(不是C++)是最佳选择.本文将建立并实现一个简单的服务程序,其功能是查询系统 ...

  7. 用C语言编写Windows服务程序的五个步骤

    Windows 服务被设计用于需要在后台运行的应用程序以及实现没有用户交互的任务.为了学习这种控制台应用程序的基础知识,C(不是C++)是最佳选择.本文将建立并实现一个简单的服务程序,其功能是查询系统 ...

  8. Python3编写Windows服务程序

    最近做了公司签到的小工具,有同事要求做成Windows服务,开机自启.先说下怎么用Python写Windows服务程序. #encoding=utf-8 import win32serviceutil ...

  9. Windows+Git+TortoiseGit+COPSSH安装图文教程 转载

    准备工作: 1. Git-1.8.1.2-preview20130201.exe 下载地址: https://code.google.com/p/msysgit/downloads/list 2. C ...

随机推荐

  1. C#socket通讯两个最经典错误解决方案

    1.经典错误之 无法访问已释放的对象. 对象名:“System.Net.Sockets.Socket”     (1).问题现场   (2).问题叙述 程序中的某个地方调用到了socket.close ...

  2. centos静默式安装Oracle11g

    1.   Centos及Oracle版本 Centos:CentOS release 6.4 (Final) Oracle:linux.x64_Oracle_11gR2_database 2.   硬 ...

  3. arraylist的使用

    ArraylistDemo package cn.stat.p6.arraylist.demo; import java.util.ArrayList; import java.util.Iterat ...

  4. out返回值的用法与用途

    static void Main(string[] arr) { Console.WriteLine("请输入用户名"); string uname = Console.ReadL ...

  5. Codeforces Round #278 (Div. 1)

    A A monster is attacking the Cyberland! Master Yang, a braver, is going to beat the monster. Yang an ...

  6. HTML5画布(阴影)

    案例1: <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8& ...

  7. 3月26日html(七)window document

    ---恢复内容开始--- 1.Window.document对象 一.找到元素: docunment.getElementById("id"):根据id找,最多找一个:     v ...

  8. LBS配置

    js: <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak= ...

  9. Netbeans 注释模板配置

    工具->模板->展开Java 选中Java类->在编辑器中打开 修改如下: <#if package?? && package != ""& ...

  10. 通过select选项动态异步加载内容

    通过监听select的change事件来异步加载数据. 1:效果图: 选择Good: 选择 Bad: 2:index.html <!DOCTYPE html> <html lang= ...