一.创建windows服务项目
打开vs2012,新建项目选择windows服务
二.写服务程序
项目创建成功之后,打开service.cs类,在这里,我们写入一点简单的代码。
我们在服务启用和停止的时候向D盘的一个文本文件进行写入数据的操作。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
namespace WindowsService1
{
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
FileStream fs = new FileStream(@"d:\windowsservice.txt", FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
sw.BaseStream.Seek(0, SeekOrigin.End);
sw.WriteLine("Service Start" + DateTime.Now.ToString() + "\n");
sw.Flush();
sw.Close();
fs.Close();
}
protected override void OnStop()
{
FileStream fs = new FileStream(@"d:\windowsservice.txt", FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
sw.BaseStream.Seek(0, SeekOrigin.End);
sw.WriteLine("Service Stop" + DateTime.Now.ToString() + "\n");
sw.Flush();
sw.Close();
fs.Close();
}
}
}
其中,重写的方法OnStart内的程序为服务启动时的执行,OnStop内的程序是服务停止时执行。
回到service1.cs的设计窗口,右键添加安装程序。
将serviceProcessInstaller1的属性Account设置为LocalSystem
Account属性不同值的区别见下表
将serviceInstaller1的ServiceName属性修改为service1,与服务类名相对应
starttype属性的区别
保存生成项目。
三.安装服务
这里先说最简单粗暴的方式。
写两个批处理程序,保存文件时的格式选择utf-8,不知道如何修改的小伙伴们推荐使用editplus。
install.bat:
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe WindowsService1.exe
Net Start Service1
sc config Service1 start= auto
pause
其中 Net start service1为启动服务,auto为是否自动运行,这部分代码可以根据需求自行改动。
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u WindowsService1.exe
之后,win7的用户可以考虑直接运行就ok,win10由于权限问题,直接运行可能会报错
按照网上看到的一些方法,将生成的WindowsService1.exe的属性改为管理员身份运行,然而也未必会有用。
这时候用最粗暴的方式,以管理员身份运行cmd,定位到bat所在位置,直接运行install.bat,应该可以安装成功,卸载同理。
顺利安装成功之后我们去D盘看看我们用windows 服务创建的文件。
没问题,该写的内容已经写入。卸载同理,就不用看了~
当然,我们还想看看这个服务到底还在不在运行。
ok哒~第一个简单的win服务搞定
四.服务循环执行的方法
重温一下timer。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
namespace WindowsService1
{
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
Timer timer;
public static int num = 1;
protected override void OnStart(string[] args)
{
timer = new Timer();
timer.Interval = 3000;
timer.Elapsed += new ElapsedEventHandler(StartWrite);
timer.Enabled = true;
}
protected override void OnStop()
{
this.timer.Enabled = false;
FileStream fs = new FileStream(@"d:\windowsservice.txt", FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
sw.BaseStream.Seek(0, SeekOrigin.End);
sw.WriteLine("Service Stop" + DateTime.Now.ToString() + "\n");
sw.Flush();
sw.Close();
fs.Close();
}
public static void StartWrite(object sender, ElapsedEventArgs e)
{
FileStream fs = new FileStream(@"d:\windowsservice.txt", FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
sw.BaseStream.Seek(0, SeekOrigin.End);
sw.WriteLine("第"+num+"次写入:" + DateTime.Now.ToString() + "\n");
num++;
sw.Flush();
sw.Close();
fs.Close();
}
}
}