windows服务编写

.Net下的Windows服务程序开发指南.

最近一个月都异常的繁忙,项目进度非常的紧,回头看看自己的blog,整整一个5月都没有一篇文章,非常惭愧,现在补几篇文章,介绍一下我最近关注的技术.这篇文章将介绍Windows服务程序的开发.
摘要:
本文将较为详细的介绍如何在.net下开发Windows服务程序,并将简要介绍一些开发中的调试技巧及后期的部署问题.
IDE:VS2005, DotNetFramework Version:2.0.50727

Windows服务程序通常是一种在OS的后台长期运行的程序,根据需要你可以设置为随服务器启动而同时启动等等,在传统的C/S结构的程序开发中,Windows服务更是以Server端普遍存在.在.NET应用程序中,无论是Winform下的应用还是ASP.NET,Windows服务也都非常重要,比如我们可以把一个.Net Remoting服务端封装在一个windows服务中,来达到稳定提供服务的目的.

切入正题,首先我们来了解如何在VS下开发基于.Net的windows服务.
实际上,在VS下建立一个windows服务程序非常的简单,微软帮我们做了80%的工作,我们所需要做的只是处理那20%的业务工作.
首先,我们建立一个Windows Service程序,VS提供了现成的项目模版,选择Files->New->Project->Windows->Windows Service


之后,你将获得两个文件Service组件和Program.cs.我们要建立服务的话,首先需要添加专用的安装组件,这步同样很简单,选择服务组件,并切换到设计模式,右键->Add Installer,生成了了安装文件,切换到设计模式,这里你将看到两个组件:ServiceInstaller和ProcessInstaller,这里没有太多需要说明的,大部分是对服务的名称,描述等信息的设置,只有2个地方需要注意下.一个是StartType,有三种选择自动,手动,禁用.如果想要自动启动,那么遍选择Automatic即可.另一个需要注意的属性是Account,选择用户,一般情况下,我们选择Local System即可.

到现在,如果我们想要建立一个服务,实际上已经结束了,只需要在服务组件的OnStart和OnStop等函数中加上个人的业务处理.在Program.cs文件中,是如下代码:

        static void Main()
        
{
            ServiceBase[] ServicesToRun;

            
// More than one user Service may run within the same process. To add
            // another service to this process, change the following line to
            // create a second service object. For example,
            //
            //   ServicesToRun = new ServiceBase[] {new Service1(), new MySecondUserService()};
            //
            ServicesToRun = new ServiceBase[] new Service1() };

            ServiceBase.Run(ServicesToRun);
        }

这段代码用于启动服务.
     如果需要安装服务的话就需要添加一个安装程序,方法是在Service1.cs的设计视图那里按右键,选择添加安装程序,就会多出一个 serviceProcessInstaller1serviceInstaller1两个组件。选择 ”serviceProcessInstaller1”工具,在属性里的Account那里从User改为LocalSystem,确保WINDOWS服务程序有足够的权限运行。然后在serviceInstaller1组件的属性里可以设置服务名称(ServiceName,即注册表内的项目名称),显示名称(DisplayName,在管理工具-服务那里显示的名称),Description就是描述的文字了,建议前两个都用英文名,否则在部分环境下无法操作服务(例如REMOTELYANYWHER远程管理的时候)。最后在StartType那里设置启动类型,一般选择Automatic,即自动。


接下来的工作就是安装服务.你可以通过制作安装包实现,或者直接通过命令行来执行安装.

当你编译完项目后,你可以在bin/debug目录下看到扩展名为.exe的可执行文件,这就是服务程序,但直接双击是无法运行的,你需要通过特定的工具来安装它,微软提供给我们的工具就是installutil.exe.这个程序位于(适用于vs2005\vs2008)

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe D:\cdcFabu\GetDate\GetDate\bin\Debug\GetDate.exe

%SystemRoot%\Microsoft.NET\Framework\/%Version%\,version指的是.net版本号.
安装一个服务程序,我们是在命令行内键入:installutil.exe  服务程序路径.如果是要删除某个服务则是installutil.exe/u 服务程序路径.
执行了安装操作后,我们去控制面版->管理工具->服务中就可以看到我们的服务程序了.


添加完服务后,编写bat文件

start.bat   net start FlightBaggageService

stop.bat    net  stop FlightBaggageService

添加到windows计划:

把bat文件添加到任务中;

 

 

最后,谈谈调试中的技巧.
编写这种服务程序,调试起来非常的麻烦,而且每次有所变化后,还得频繁的去执行installutil和installutil /u命令,实际上,我们可以通过编写一些BuildEvents来大大简化这其中的烦琐工作.这里,我们在BuildEvents编写如下事件:
net stop YourServiceName
copy /y "$(TargetDir)" "$(ProjectDir)bin"
"%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe" /u $(ProjectDir)bin\$(TargetFileName)
"%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe"  $(ProjectDir)bin\$(TargetFileName)
net start YourServiceName
简单解释下:
停止当前服务->把debug目录下所有东西copy到bin目录下->执行反安装操作->执行安装操作->启动服务.
最后把该事件设置为OnSuccessfulBuild即可.

由于是服务程序,如果想要直接debug比较的麻烦,可以通过附加进程来调试大多数代码,但是如果想要调试OnStart和OnStop方法.则只能通过其他的项目来调试.具体见这篇文章的介绍.http://leonkim.bokee.com/1857046.html
实际上,我们可以直接在OnStart()方法中通过EventLog.WriteEntry("Hi,I'm wiseman");来向事件查看器中写入一些你感兴趣的信息,很大程度上可以解决debug的问题.

本文到此结束,大致的介绍了下如何在.net下编写windows服务程序,以及一些相关的技巧.该文也是阅读我之后的某些文章需要掌握的知识,这个月我会尽量抽些时间多写几篇有关Windows服务和企业服务以及Remoting技术综合起来的应用的文章.

 

 

VS2008下WINDOWS服务的开发

2008年10月,转自我的MSN SPACE

在VS2005下曾经做过几个,但几个月不整,需要做的时候突然又忘了流程,好记性不入烂笔头,记下步骤,给自己看,也给别人看。其实VS2005和VS2008基本一样的。在文件-新建项目打开后,在VISUAL C#下的WINDOWS下选择“WINDOWS服务”。建立一个新项目后在方案资源管理器有Program.cs和Service1.cs。右键Services1.cs后查看代码,就会看到默认的两个方法       

 protected override void OnStart(string[] args)
        {
        }       

protected override void OnStop()
        {
        }
   
    ONSTART和ONSTOP里就是可以写开始和结束的代码。
   
    如果需要安装服务的话就需要添加一个安装程序,方法是在Service1.cs的设计视图那里按右键,选择”添加安装程序“,就会多出一个 serviceProcessInstaller1和serviceInstaller1两个组件。选择 ”serviceProcessInstaller1”工具,在属性里的Account那里从User改为LocalSystem,确保WINDOWS服务程序有足够的权限运行。然后在serviceInstaller1组件的属性里可以设置服务名称(ServiceName,即注册表内的项目名称),显示名称(DisplayName,在管理工具-服务那里显示的名称),Description就是描述的文字了,建议前两个都用英文名,否则在部分环境下无法操作服务(例如REMOTELYANYWHER远程管理的时候)。最后在StartType那里设置启动类型,一般选择Automatic,即自动。
   
    编译程序,生成EXE程序之后,使用以下命令行安装:
    安装参数为
   %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\installutil 程序的路径。如果要卸载需加-u参数。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值