.net Windows服务程序
.net Windows服务程序
最近项目中用到window服务程序,以前没接触过,比较陌生,花了两天的时间学习了下,写了个简单的服务,但在制作安装程序的时候,参照网上很多资料,却都制作不成功,可能是开发环境或项目配置的不同,这里把自己成功制作的方式贴出来,一方面留给自己,一方面也希望能给遇到同样问题绝望中不能自拔、以致失去灵魂的路人甲,路人乙一还魂丹 . . .
IDE :WIN2003 VS2008 SQL2005
一、创建window服务项目
首先我们建一个window服务项目 :解决方案(右击)——> 增加 ——> 新建项目——>项目类型选择Windows——>模板选择Windows服务 ,如图:
![](https://images.cnblogs.com/cnblogs_com/andy_qin/pic01.jpg)
二、编写Window服务程序
创建后会生成两个文件 Program.cs 和 Service1.cs ,其中 program.cs 这个文件不用动,里面已自动生成好了。我们在Service1.cs里增加所要的操作,里面有两个重写方法 OnStart 和 OnStop ,OnStart 方法表示服务启动的操作,OnStop 表示服务停止的操作,下面写了一个简单示例 :当服务启动后,调用远程一个WebService的Hello函数,并把返回的值写入到一个文件中。code如下:
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; using ClassLibrary1; using System.IO; namespace WindowsService { public partial class SearchService : ServiceBase { Timer serviceTimer; //定义计时器 ServiceBusiness serviceBusiness; private Thread threadTest; int period; object state; public SearchService() { InitializeComponent(); serviceBusiness = new ServiceBusiness(); } protected override void OnStart(string[] args) { //threadTest = new Thread(new ThreadStart(Dothings)); //threadTest.Start(); //Thread.Sleep(5000); period = 5000; serviceTimer = new Timer(new TimerCallback(TimeCallback), state, 0, period); } protected override void OnStop() { // threadTest.Abort(); serviceTimer.Change(Timeout.Infinite, Timeout.Infinite); } protected override void OnContinue() { //重新开始计时 serviceTimer.Change(0, period); } protected override void OnPause() { //停止计时器 serviceTimer.Change(Timeout.Infinite, Timeout.Infinite); } public void TimeCallback(object obj) { //隔一段时间调用一次 serviceBusiness.Dothings(); } public void Dothings() { string fileName = @"E:\Info.txt"; //隔一段时间调用一次 StreamWriter sw; if (!File.Exists(fileName)) { sw = File.CreateText(fileName); } else { sw = File.AppendText(fileName); } sw.WriteLine("执行1次\n" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); sw.Flush(); sw.Close(); } } }
例子很简单,方便理解,上面通过线程,每5秒执行一次操作,到这里,我们的服务以及服务实现的功能就已经写好了,下面怎么让客户端安装我们的服务呢?这里才是我写这篇文章的目的!切换到视图窗口,右击——>增加安装程序,便会增加一个程序安装类文件 ProjectInstaller.cs,如图:
这里serviceProcessInstaller1 和 serviceInstaller1 有几个重要属性要设置,serviceInstaller1 中的StartType要设置成Automatic,表示随机启动,ServiceName表示服务名称,Description 表示服务的描述, DisplayName 表示显示名称。serviceProcessInstaller1 中的Account要设置成LocalSystem,表示本地系统帐号
![](https://images.cnblogs.com/cnblogs_com/andy_qin/pic11.jpg)