服务就是一个随操作系统自动启动,不需要用户登录操作系统就能启动的特定,对于一些需要一开机就需要启动的程序来说非常的方便。但是服务与一般的程序有一些特别之处,具有如下的特点:
a.自启动。
b.不需要和用户交互。不会由于一些错误的操作而把服务给关闭了。
c.可以长时间运行,
1.如何创建一个.net service服务
创建一个.net 服务主要包括2部分:serviceInstaller和一个继承自ServiceBase类的解决现实问题的程序代码。
1.1 继承自ServiceBase类的service
首先我们需要添加一个Windows Service的新项,如下图所示:
添加ServiceAppTest完成后,在ServiceAppTest中有两个重要的方法OnStart和OnStop方法,我们需要在这两个方法中添加我们的逻辑代码。
1.2添加Installer.
在ServiceAppTest的设计视图中,右键->Add Installer,如下图所示
在添加完installer后,在ServiceAppTest中会多出两个组件:serviceProcessInstaller1和ServiceInstaller1,我们可以在serviceInstaller1中添加服务的名称、描述、启动类型。在做完上面这些操作后,一个基本的windows service的架构就已经完成了,但是现在我们的服务不能做任何的事情,因为在OnStart和OnStop方法中没有添加任何的代码,接下去我们来完成这两个方法的代码。
1.3添加OnStart和OnStop方法
在Onstart方法中一般是添加启动相关逻辑的代码,比如可以启动用于处理从客户端过来的socket连接的、数据查询等。一般做法是启动线程,然后让线程等待连接过来,尽量不要在onstart中启动比较耗时的操作,不然在windows service控制界面启动service的时候好以后很容易出现超时的错误。
在OnStop方法,一般是用于释放资源的操作,也要尽量简单.
2.发布服务到系统中
当我们需要手动部署windows service的时候,一般都是利用.net Frameworl中自带的installUtil.exe来完成注册,格式一般如下:
installUtil.exe service程序的全路径,如: installUtil.exe "c:\test\testService.exe"
卸载服务也可以采用insallutil.exe来完成,如: installUtil.exe "c:\test\testService.exe" /u
2.1注意问题
利用installuntil.exe命令来部署的时候会报文件找不到的错误,明明所有的service程序和依赖的dll都在目录下,为什么还会报FileNotFound的问题,一般会有如下的几个原因
a.如果是手动部署service,并且文件都是从其他地方(网络)拷贝过来,文件会被加锁(右键->属性),如下图:。出现这种情况只要解锁文件就可以了,然后重新利用installutil.exe来注册一般就可以。
b.一般installuntil.exe会存在两个目录中,一个在C:\Windows\Microsoft.NET\Framework\v+.net feamework版本;还有一个是在C:\Windows\Microsoft.NET\Framework64\v+.netframework版本号中。这两个在一般情况是就是64位程序和32位程序的区别。一般情况下可以使用C:\Windows\Microsoft.NET\Framework\v+.net feamework版本下的installutil.exe来注册服务就可以了。