简述
要在Windows中做一个服务,可以分为两步:
- 写一个可以响应服务控制管理器(SCM)的应用程序,SCM是什么呢?服务控制管理器(Service Control Manager,简称SCM)是Windows NT操作系统中的特殊系统进程,其控制Windows服务进程的启动、停止和交互(来自百度)。 可见,SCM是操作系统和系统服务之间沟通的桥梁,他们之间以一种特有的指令传送和执行。使用C#做Windows服务是非常方便的,微软为其提供了非常有力的支持。废话不说了,我们以一个简单的例子看看代码上怎样实现。
- 编写服务启动和停止的bat脚本,用以启动和停止服务。
P.S 我这里使用的ide是VS2017,其他版本没有测试过,应该也是大同小异。
编写服务应用程序
1.安装下图,新建Windos服务
2.在新建的项目中自动添加一个名字为Service1.cs的文件,这个文件就是我们要做的服务承载文件。
3.我们到代码里面看一下,构造函数中是常见的初始化函数,这个暂时不用关心。另外两个重载函数OnStart和OnStop,跳到定义位置可以看到,这两个会在服务开始和停止的时候被调用。在这两个函数中添加写入日志的,方便调试。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace TestService
{
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
FileStream fs = new FileStream("c:\\test.txt", FileMode.OpenOrCreate);
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine("Test service start");
sw.Close();
}
protected override void OnStop()
{
FileStream fs = new FileStream("c:\\test.txt", FileMode.OpenOrCreate);
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine("Test service stop");
sw.Close();
}
}
}
4.编译项目,通过没有问题,直接运行却有如下错误提示。不难看出,生成的应用不能以普通的应用直接运行,而必须按照服务特有的方式运行。
服务启动
服务启动有两种不同的方式,一种是使用installUtil.exe安装工具,另一种是使用批处理sc命令,考虑到通用性,我们使用批处理sc命令的方式。
- sc命令详解
- 安装服务
sc create ServiceName binPath= "C:\Users\Administrator\source\repos\TestService\TestService\bin\Debug\TestService.exe" 其中,ServiceName是服务名称,这个名称就是在任务管理器中我们看到的服务名字。binPath是第一部分中生成的应用程序文件。
- 配置服务
sc config ServiceName start=AUTO 这里AUTO为服务的启动方式为自动,除了AUTO之外,还有DEMAND手动和DISABLED禁用
- 开启服务
net start ServiceName
- 关闭服务
net stop ServiceName
- 删除服务
sc delete ServiceName
- 安装服务
- 创建服务并启动
echo.服务启动...... echo off sc create TestService binPath= "C:\Users\Administrator\source\repos\TestService\TestService\bin\Debug\TestService.exe" sc config TestServicestart= AUTO net start TestService echo.启动完毕! pause
将以上代码复制到txt文件中,保存为bat格式,运行之后cmd黑框显示如下:显示服务创建成功,查看任务管理器我们可以看到TestService已经存在,而且c盘根目录下也已经有了test.txt文件。
3.停止服务并删除服务,sc代码如下,运行之后TestService被停止、删除
echo off
net stop "TestService"
sc delete "TestService"
pause