在 .NET Framework 平台中编写 Windows 服务 算是一件比较容易的事情。首先打开 Visual Studio 创建一个名为 Windows 服务 的项目,创建后看到的是一个 .cs 文件的设计界面,用鼠标右键单击可以看到几个菜单,点击添加安装程序后又会转到另一个 .cs 文件的设计界面,这个界面上默认有两个组件,一个叫 serviceProcessInstaller1,另一个叫 serviceInstaller1,其中 serviceInstaller1 组件的属性窗口如下:

Description 属性和 DisplayName 属性分别指服务的描述和名字,ServiceName 属性指服务的进程名字,StartType 属性指服务的启动类型,这里选择 Automatic 的意思为自动启动;这里把 serviceProcessInstaller1 组件的 Account 属性修改为 LocalSystem,要不然等到安装服务的时候可能会出现要求输入用户名和密码的对话框。
服务安装组件的配置已经完了,现在转到服务的代码位置,还是在刚才那个右键菜单位置,点击“查看代码”就可以看到服务要执行的代码,我编写如下代码:
using System;
using System.ServiceProcess;
namespace WindowsService1
{
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
System.Timers.Timer timer = new System.Timers.Timer();
protected override void OnStart(string[] args)
{
timer.Interval = 1000;
timer.AutoReset = true;
timer.Enabled = true;
timer.Start();
timer.Elapsed += new System.Timers.ElapsedEventHandler(timertick);
}
private void timertick(object source, System.Timers.ElapsedEventArgs e)
{
System.IO.FileStream fs = new System.IO.FileStream("D:\\log.txt", System.IO.FileMode.Append);
System.IO.StreamWriter sw = new System.IO.StreamWriter(fs);
sw.WriteLine(DateTime.Now.ToString());
sw.Close();
fs.Close();
}
protected override void OnStop()
{
}
}
}
OnStart 方法中的代码会在服务启动时执行一次,所以这里我用了一个定时器无限执行;OnStop 方法中的代码会在服务停止时执行。
服务程序编译后依然会是 .exe 文件,只不过不能够直接运行,这里需要使用 .NET Framework 提供的程序来安装我们编写的服务(使用CMD),安装服务的命令如下:
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe D:\WindowsService1.exe
注意命令需要用管理员权限执行,InstallUtil 程序的路径可能会不一样,这个根据 .NET Framework 安装时的路径决定,卸载服务的命令如下:
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u D:\WindowsService1.exe
服务安装成功后可以在 Windows 服务管理程序中找到: