您的位置:首页 > 编程语言 > C#

C# 开发Windows Service(一)——第一个windows服务开发和安装卸载

2016-09-01 14:05 549 查看
一.创建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为是否自动运行,这部分代码可以根据需求自行改动。

uninstall.bat:
%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();
}
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  vs2012 c# windows service
相关文章推荐