原文地址:http://blog.itpub.net/23109131/viewspace-688117/
第一步:创建服务框架
创建一个新的 Windows 服务项目,可以从Visual C# 工程中选取 Windows 服务(Windows Service)选项,给工程一个新文件名,然后点击确定。现在项目中有个Service1.cs类:
查看其各属性的含意是:
Autolog 是否自动写入系统的日志文件
CanHandlePowerEvent 服务时候接受电源事件 CanPauseAndContinue 服务是否接受暂停或继续运行的请求 CanShutdown 服务是否在运行它的计算机关闭时收到通知,以便能够调用 OnShutDown 过程 CanStop 服务是否接受停止运行的请求 ServiceName 服务名第二步:向服务中增加功能
在 .cs代码文件中我们可以看到,有两个被忽略的函数 OnStart和OnStop。
OnStart函数在启动服务时执行,OnStop函数在停止服务时执行。这个例子是:当启动和停止服务时,定时显示“hello,你好”;
首先在Service1.cs设计中拖个timer控件,设置好它的Interval=60000,与要做的功能
代码如下:
//OnStart函数在启动服务时执行 protected override void OnStart(string[] args) { this.timer1.Start(); } // OnStop函数在停止服务时执行 protected override void OnStop() { this.timer1.Stop(); } private void timer1_Tick(object sender, EventArgs e) { System.Diagnostics.Process.Start("http://www.baidu.com"); }
第三步: 将安装程序添加到服务应用程序
1:在解决方案中,右击服务Service1.cs设计视图。
2:在属性窗口中,单击-添加安装程序
这时项目中就添加了一个新类 ProjectInstaller 和两个安装组件 ServiceProcessInstaller 和 ServiceInstaller,并且服务的属性值被复制到组件。
3:若要确定如何启动服务,请单击 ServiceInstaller 组件并将 StartType 属性设置为适当的值。
Manual 服务安装后,必须手动启动。
Automatic 每次计算机重新启动时,服务都会自动启动。
Disabled 服务无法启动。
4:将serviceProcessInstaller类的Account属性改为 LocalSystem
这样,不论是以哪个用户登录的系统,服务总会启动。
第四步:生成服务程序
通过从生成菜单中选择生成来生成项目shift+F6。或重新生成项目注意 不要通过按 F5 键来运行项目——不能以这种方式运行服务项目。
第五步:服务的安装与卸载
访问项目中的已编译可执行文件所在的目录。
用项目的输出作为参数,从命令行运行 InstallUtil.exe。在命令行中输入下列代码: installutil WindowsService1.exe卸载服务
用项目的输出作为参数,从命令行运行 InstallUtil.exe。installutil /u WindowsService1.exe
附:installutil.exe 在安装VS电脑的C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe
到vs2008命令提示符下installutil.exe /?可以查看其帮助说明推荐的另一中安装服务的方法
用winform来调用安装,当点击按钮时,安装服务.1.项目需要添加引用System.Configuration.Install和System.ServiceProcess代码如下:
using System.Configuration.Install;using System.ServiceProcess;/// <summary> /// 安装服务 /// </summary> private void btnInstall_Click(object sender, EventArgs e) { string[] args = { "WindowsService1.exe" }; //卸载服务 string[] args = {"/u", "WindowsService1.exe"}; if (!ServiceIsExisted("Service1"))//这里的Service1是对应真实项目中的服务名称 { try { ManagedInstallerClass.InstallHelper(args); //参数 args 就是你用 InstallUtil.exe 工具安装时的参数。一般就是一个exe的文件名
} catch (Exception ex) { MessageBox.Show(ex.Message); return; } } else { MessageBox.Show("该服务已经存在,不用重复安装。"); } } /// <summary> /// 检查指定的服务是否存在。 /// </summary> /// <param name="serviceName">要查找的服务名字</param> /// <returns></returns> private bool ServiceIsExisted(string svcName) { ServiceController[] services = ServiceController.GetServices(); foreach (ServiceController s in services) { if (s.ServiceName == svcName) { return true; } } return false; }通过System.Configuration.Install.ManagedInstallerClass 类中的静态方法 InstallHelper就可以实现手工安装。 该方法的
签名如下:
public static void InstallHelper(string[] args) 其中参数 args 就是你用 InstallUtil.exe 工具安装时的参数。一般就是一个exe的文件名
第六步:调试服务
安装后,服务不会自动启动,服务不可以与桌面交互
1.设置服务安装后自动启动
添加serviceInstaller1的AfterInstall事件using System.Diagnostics;private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e){ System.ServiceProcess.ServiceController s = new System.ServiceProcess.ServiceController("Service1"); s.Start();//设置服务安装后立即启动}
2.设置允许服务与桌面交互方法
让服务启动某个应用程序,就要修改服务的属性,勾选允许服务与桌面交互,#region 设置服务与桌面交互
////// 设置服务与桌面交互,在serviceInstaller1的AfterInstall事件中使用/// /// 服务名称private void SetServiceDesktopInsteract(string serviceName){ System.Management.ManagementObject wmiService = new System.Management.ManagementObject(string.Format ("Win32_Service.Name='{0}'", serviceName)); System.Management.ManagementBaseObject changeMethod = wmiService.GetMethodParameters("Change"); changeMethod["DesktopInteract"] = true; System.Management.ManagementBaseObject utParam = wmiService.InvokeMethod("Change", changeMethod,null ); } #endregion
3.windows服务是不执行Timer控件的,解决办法
把上面用到的Timer控件清除public Service1() { InitializeComponent();System.Timers.Timer t = new System.Timers.Timer();
t.Interval =1000*15; t.Elapsed += new System.Timers.ElapsedEventHandler(RunWork); t.AutoReset = true;//设置是执行一次(false),还是一直执行(true); t.Enabled = true;//是否执行}
public void RunWork(object source, System.Timers.ElapsedEventArgs e) { //要定时处理的事情 //这样服务就可以定时执行任务了 }总结:windows服务编程
1.服务不会执行Timer控件2.默认服务安装完成后,是不会自动启动,不能与桌面交互3.安装服务时,推荐新建个winform项目,用winform项目来执行服务的安装与卸载4.OnStart函数在启动服务时执行,OnStop函数在停止服务时执行。5.右击-将服务添加到应用程序