Windows服务是C/S程序另一种表现形式。在.NET开发下的windows服务和系统其他服务表现形式一样。
首先介绍开发Windows服务的两个重要的类window服务类(假称A类)和添加安装程序类(假称B类)。在B类中有两个组件serviceInstaller1、serviceProcessInstaller1。他们分别是System.ServiceProcess.ServiceInstaller、System.ServiceProcess.ServiceProcessInstaller的对象。那么他们两有什么区别吗?MSDN给出的解释如下:
ServiceProcessInstaller:安装一个可执行文件,该文件包含扩展 ServiceBase 的类。该类由安装实用工具(如 InstallUtil.exe)在安装服务应用程序时调用。ServiceProcessInstaller 执行可执行文件中的所有服务的公共操作。安装实用工具使用它来写与要安装服务关联的注册表值。
若要安装服务,请创建一个从 Installer 继承的项目安装程序类,然后将该类上的 RunInstallerAttribute 设置为 true。在项目中,为每个服务应用程序实例化一个 ServiceProcessInstaller 实例,并为应用程序中的每个服务实例化一个ServiceInstaller 实例。最后,向项目安装程序类添加 ServiceProcessInstaller 实例和 ServiceInstaller 实例。
当 InstallUtil.exe 运行时,该实用工具在服务程序集内查找 RunInstallerAttribute 设置为 true 的类。通过将类添加到与项目安装程序关联的 Installers 集合来向服务程序集添加类。如果 RunInstallerAttribute 为 false,安装实用工具将忽略项目安装程序。
对于 ServiceProcessInstaller 实例,可修改的属性包括指定服务应用程序在登录用户之外的帐户下运行。可指定运行该服务所使用的特定UserName 和Password 对,或者可使用Account 指定该服务是在计算机的系统帐户、本地或网络服务帐户还是用户帐户下运行。(注意:计算机的“系统”帐户与“管理员”帐户不同。)
ServiceInstaller:安装一个类,该类扩展 ServiceBase 来实现服务。在安装服务应用程序时由安装实用工具调用该类。ServiceInstaller 执行特定于其所关联服务的操作。它由安装实用工具用来将与服务关联的注册表值写入 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services 注册表项内的子项。服务由它在该子键内的“服务名”(ServiceName) 标识。该子键还包含服务所属的可执行文件或 .dll 的名称。
以上至列出简要介绍,更详尽的介绍请参见MSDN.
下面简要介绍服务的是实现过程。
一、.NET 2.0平台上不能直接建立windows服务项目。在.NET 2.0平台上开发windows服务,需要自己建立工程,然后添加安装程序(Installer.cs)和window服务(Service.cs)。然后在,安装程序文件和window服务文件中分别编写代码完成。
环境介绍:.NET2.0 SP2.(我电脑上面不能直接创建,但是我同事电脑能直接创建Windows服务。没闹明白这两个SP2区别在哪。但是他的版本应该比我的高)
过程如下:
1.建立项目(我开发的时候直接建立的Winfrom项目),右击项目,在选择添加安装程序(Installer.cs)和window服务(Service.cs)分别添加到项目中。如下图:
2.在Service.cs中using System.ServiceProcess命名空间。
ServiceInstaller installer = new ServiceInstaller();
//设置服务名称
installer.ServiceName = "TestDemo";
//设置服务的启动类型。下面设置的启动方式为自动启动
installer.StartType = ServiceStartMode.Automatic;
//设置服务的描述
installer.Description = "测试服务";
//申明服务安装对象(在使用安装服务工具时,它会被工具调用以完成服务安装)
ServiceProcessInstaller processer = new ServiceProcessInstaller();
//设置服务的账户。下面设置的为本地系统
processer.Account = ServiceAccount.LocalSystem;
//将安装服务实例与安装处理对象添加到安装程序的集合。
Installers.Add(installer);
Installers.Add(processer);
3.在以下方法中编写服务启动以及服务停止时的代码
protected override void OnStart(string[] args)
{
}
protected override void OnStop()
{
}
4.将program.cs中的入口函数(main函数)中,改为ServiceBase.Run(new Service1())
5.生成.exe文件
二、在.NET3.5平台上开发windows服务可以直接在建立项目上键一个window服务项目,里面直接就有了Service.cs文件,用户可以添加为他添加安装程序以完成windows服务的开发。
环境介绍:.NET3.5SP2.
1.右击Service1.cs查看设计器。然后在设计器重右击选择菜单中的添加安装程序,系统会为此服务添加安装程序的文件ProjectInstall .cs(默认名称,当然你也可以修改)。
2.同样的方式查看ProjectInstall .cs中右击,选择查看设计器。在他的设计器重默认有两个文件:ServiceProcessInstaller1和ServiceInstaller1.cs。
3.设置ServiceProcessInstaller1和ServiceInstaller1.cs的属性。将ServiceProcessInstaller1的Account设置为LocalSystem.当然你也可以设置为其他的。若你将 其设置为User则你需要在安装服务的时候设置服务登陆。我例子中 ServiceProcessInstaller1属性的设置如下图:
ServiceInstaller1.cs的属性设置如下图:
其中他的属性设置和2.0平台上的的上述例子的installer属性设置一样。只是一个通过属性设置、一个通过代码设置。
3.编写服务实现的功能。如下为我做的服务测试的功能:每一秒向指定文本将当前时间写进去。
System.Timers.Timer timer;
public Service1()
{
InitializeComponent();
this.ServiceName = "TestDemo";
}
protected override void OnStart(string[] args)
{
timer = new System.Timers.Timer(1000);
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
timer.AutoReset = true;
try
{
timer.Start();
}
catch(ArgumentOutOfRangeException Ex)
{
throw Ex;
}
}
protected override void OnStop()
{
timer.Stop();
timer = null;
}
private void timer_Elapsed(object obj, EventArgs args)
{
using (FileStream fs = new FileStream(@"D:\test.txt", FileMode.Append, FileAccess.Write))
{
using (StreamWriter sw = new StreamWriter(fs))
{
sw.WriteLine(DateTime.Now.ToString());
}
}
}
4.编译项目,生成安装文件
三、服务的安装。
不管在2.0平台还是3.5平台,对windows服务的安装都是 通过installutil工具完成的。使用方法如下:
1.打开VS2008下的命令提示。
2.输入installutil D:\Visual2008\WindowsService\WindowsService1\WindowsService1\bin\Release\WindowsService1.exe,即可完成服务的安装。安装成功后的命令界面太大这里就不截取了。安装成功的服务
可以在计算机的服务中找到。如下如图:
3》服务的卸载:输入installutil /u D:\Visual2008\WindowsService\WindowsService1\WindowsService1\bin\Release\WindowsService1.exe即可完成服务的卸载。若此时服务正在运行中,也可卸载(它会先尝试关闭服务,然后卸载)。如下图:
做完这些后,就可以在D:\test.txt中看到每个一秒的时间记录。
就写到这里了,希望对进行相关开发的朋友们有所帮助!
注意:使用installutil工具安装服务时候,如果路径中存在空格,安装会报错。