之前做的一个项目里有人用Service的方法定时获取远程数据,很犀利,我感觉还是挺有用的。所以今天我也开荒了一下用C#开发Windows服务,正规的体验了一下开发流程。下面就是我做的最入门的例子,MSDN上有类似的教程,但MSDN漏了一些比较重要的步骤,所以大家请看我开荒成功的版本:
首先,在VS2010里建立一个Windows Service项目:
它会提供我们一个默认的Serivce1,可以删掉,换成自己的。比如Fucker.cs,当然,你得把Program.cs里调用的语句换掉:
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Fucker()
};
ServiceBase.Run(ServicesToRun);
}
创建Fucker.cs后,打开Design视图,从工具箱里拖一个EventLog进来,这个是在Components分类里的。注意,你不能用Windows Form的控件了,不然编译会爆。如果你的Service想用UI的方式弹出消息,只能在build的文件夹里再放一个开发好的专门弹东西的exe了。。。
现在,你就可以码这个Service了。先在构造函数里加几句话:
public Fucker()
{
InitializeComponent();
if (!System.Diagnostics.EventLog.SourceExists("TheFuckers"))
{
System.Diagnostics.EventLog.CreateEventSource("TheFuckers", "FuckerLog");
}
evt.Source = "TheFuckers";
evt.Log = "FuckerLog";
}
首先判断系统的EventLog里有木有“TheFuckers”这个分类,如果木有,就建一个。后面那个参数“FuckerLog”是Log的名称。接下来我们要在服务启动和停止的时候写日志:
protected override void OnStart(string[] args)
{
evt.WriteEntry("Oh Fuck!");
}
protected override void OnStop()
{
evt.WriteEntry("Oh Shit!");
}
现在,Fucker的服务就码完了。我们需要添加一个很重要的installer,不然没法安装。方法是在Fucker的设计视图上点右键,选Add Installer:
然后我们要码一下ProjectInstaller.Designer.cs,注意,是Designer.cs,设计器生成的那个代码文件,而不是设计视图上点右键出来的那个ProjectInstaller类。
首先要去掉用户名和密码,不然安装的时候会问你要,它会用这个帐号去启动服务,如果你的帐号没有权限,服务是要安装失败的。注释掉下面的代码:
// this.serviceProcessInstaller1.Password = null;
// this.serviceProcessInstaller1.Username = null;
然后换成LocalSystem身份启动服务:
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
如果要更改服务的名称(就是在服务管理器里看到的名字)可以改ServiceName属性:
this.serviceInstaller1.ServiceName = "Fucker";
现在代码部分已经码完了,最后要在项目属性里改一个Start Up的选项:
然后编译一下,成功之后会在bin文件夹生成一个exe。
然后在VS2010附送的命令行工具里用installutil.exe就可以安装了:
D:\DotNetProjects\TestLab\ShowFuck\bin\Debug>installutil.exe ShowFuck.exe
安装成功会显示消息:
现在去Windows的服务管理器里就能够看到我们的服务了:
试试启动再停止服务,我们就可以在事件日志里看见Fuck了,哈哈。