首先如何开发自己的Windows服务呢?打开你的vs,新建一个项目,选择“Windows服务”,会创建一个Windows服务项目,里面会包含一个“Service1.cs”文件,打开这个文件,单击右键选择“查看代码”,代码结构如下:
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
namespace MyService
{
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args) //服务在启动的时候运行
{
File.AppendAllText("D:\\log.txt", "服务启动……" + DateTime.Now.ToString());
}
protected override void OnStop() //服务在停止的时候运行
{
File.AppendAllText("D:\\log.txt", "服务关闭……" + DateTime.Now.ToString());
}
}
}
从代码可以看出,实际上就是新建一个继承了“ServiceBase”这个基类的类“Service1”,这个类里面有两个重写的方法体,分别是OnStart和OnStop,我分别在这两个方法体中实现了两个功能,
在Onstart方法里面,我会在D盘的log.txt文本文件里面插入一段文字,文子内容为“服务启动.....”+现在的时间
在OnStop方法里面。我同样的在D盘的log.txt文本文件里面插入一段文字,文字内容为“服务关闭....”+现在的时间
OnStart方法是在服务启动的时候运行,OnStop方法会在服务停止的时候运行。
好了,上面就是如何创建服务的方法,实现的功能很简单,主要是体会一下如何去创建一个windows服务,此处主要是讲如何去安装、运行和卸载服务。
实际上,vs自带的工具里面有安装服务的工具“installutil.exe”,这个是vs提供的工具,用来手动安装服务,这里暂时不讲如何利用这个工具来安装服务,不过要提一下利用installutil.exe工具安装服务,第一次需要手动启动服务,服务才会跑起来,即便是你已经将服务设置为自动启动的状态,也是如此。接下来讲一下如何通过代码来实现自动安装、运行和卸载服务。
同样的,我创建一个新的窗体应用程序,这个程序里面有一个窗体,里面有四个按钮,分别是“安装”、“运行服务”、“停止服务”、“卸载”如下图:
安装服务的代码:
首先是“安装”按钮的点击事件如下:
private void button1_Click(object sender, EventArgs e)
{
//Process.Start();
string path = AppDomain.CurrentDomain.BaseDirectory;
path = @"D:\MyService.exe";
Process.Start("sc", "create myserver1 binpath= \"" + path + "\" displayName= 我的服务 start= auto");
MessageBox.Show("安装成功");
}
在这个方法里面有个path变量,这个变量存放的就是上面我新建的那个服务的完整路径(此处我是将上面建的服务放在D盘下面)。这里安装服务的方法是用的SC命令,格式如下:sc create [服务名] [binpath=] <option1> <option2> <option3>
卸载服务的代码如下:
private void button3_Click(object sender, EventArgs e)
{
Process.Start("sc", "delete myserver1");
MessageBox.Show("卸载成功");
}
卸载服务的方法也是用SC命令,格式如下:sc delete [服务名]
启动服务的代码如下:
private void button2_Click(object sender, EventArgs e)
{
foreach (var service in ServiceController.GetServices())
{
if (service.ServiceName == "myserver1")
{
service.Start();
break;
}
}
MessageBox.Show("已启动");
}
这里使用ServiceController这个类的方法GetServices()来获取计算机中所有服务,然后遍历这个服务结果,找到服务名称为myserver1的服务,使用服务的Start()方法来启动服务
停止服务的代码如下:
private void button4_Click(object sender, EventArgs e)
{
foreach (var service in ServiceController.GetServices())
{
if (service.ServiceName == "myserver1")
{
service.Stop();
break;
}
}
MessageBox.Show("已停止");
}
这里同样的也是使用ServiceController这个类的方法GetServices()来获取计算机中所有服务,然后遍历这个服务结果,找到服务名称为myserver1的服务,使用服务的Stop()方法来停止服务
好了,现在来看看运行结果如何吧
我们首先打开“服务”窗口,打开方式:在“运行”命令输入框中输入services.msg,进入到“服务”窗口,如下:
可以看到服务列表最后一个服务是传真服务,现在我们将我们刚才创建的窗体应用运行起来,然后点击“安装”按钮,再来看下“服务”窗口中的服务列表是不是多了一条服务,如下图
可以看到里面多了一条“我的服务”这条服务,我们双击它看下它的属性
可以看到服务名称为“myserver1”,显示名称为“我的服务”,可执行文件的路径为“D:\MyService.exe”,这和我们在代码里面写得创建服务的参数完全一致,但是此时服务并没有启动起来,接下来看下点击“启动服务”按钮会是什么结果。。。
可以看到服务状态为“已启动”,我们再来看下我们创建的服务应用里面的OnStart()方法里面做了什么:
protected override void OnStart(string[] args)
{
File.AppendAllText("D:\\log.txt", "服务启动……" + DateTime.Now.ToString());
}
是的,我们设定好在服务启动的时候会在D盘的log.txt文件里面新增一段文字,文字内容为“服务启动....”+时间,我们再来看下D盘里面有没有log.txt这个文件:
打开看下里面的内容:
然后再点击“停止服务”按钮,看下发生的结果:
可以看到,在“服务”窗口列表中“我的服务”的状态已经不是“已启动”状态了,在D盘的log.txt文件里也多了条记录
再看下点击“卸载”按钮的结果:
刷新一下“服务”窗口列表,你会发现“我的服务”那条记录已经不见了
总结一下:
安装服务和卸载服务,我是用了SC命令,通过Process.Start()方法来执行SC命令,但是服务安装上去之后并不会自动执行,需要手动的去启动,所以我们可以用代码来实现启动功能。我们可以调用ServiceController.GetServices()这个方法返回本机中所有的服务,然后遍历返回的结果集,从中找到我们自己建的服务,我们得到的结果是一个ServiceController对象,这个对象提供了服务的启动和停止的方法,所以我们可以调用这两个方法来实现服务的启动和停止的功能。