Windows 服务 同时启动多个服务
独立观察员 2019.02.26
最近需要开发 Windows Service 程序,之前没有接触过,所以把了解到的一些东西记录下来。
Windows 服务程序可以简单理解为需要长时间在后台运行, 而又不需要界面显示的程序,在计算机管理 --> 服务和应用程序 --> 服务中可以看到:
我们先来新建一个 "Windows 服务" 项目,具体可参考《C# 编写 Windows Service(windows 服务程序)》(https://www.cnblogs.com/bluestorm/p/3510398.html)一文。
逻辑写在继承于 ServiceBase 类的类中,该类型的类通过添加 "Windows 服务" 来生成:
双击生成的类文件,打开的是一个设计页面,可点击切换到代码视图:
代码视图中可以看到,是继承于 ServiceBase 类的,主要逻辑写在 OnStart 和 OnStop 方法中:
在 Service1 的设计页面右键 -->"添加安装程序",生成 ProjectInstaller.cs ,也是个设计页面,包含一个 serviceProcessInstaller1 组件和一个 serviceInstaller1 组件:
其中 serviceProcessInstaller1 属性中一般将 Account 的值改为 LocalSystem :
而 serviceInstaller1 的属性中,Description 是描述信息,DisplayName 是显示的名称,都在开头提到的系统服务管理页面中显示。ServiceName 指定了程序中使用该服务要用的名称。StartType 一般选为 Automatic,代表了自动启动:
然后就是安装和启动了,有好几种方法,本文采用 InstallUtil.exe 和 批处理 结合的方式。InstallUtil.exe 命令行工具在 % SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe 路径下,可以直接带路径使用,也可以拷到项目中使用。
下面给出批出理代码:
安装和启动服务
CD /D "%~dp0"
InstallUtil WindowsServiceTest.exe
net start Service1
net start Service2
pause
其中第一行是 cd 到当前目录。第二行是安装服务,WindowsServiceTest.exe 是服务所在的程序名。第三行是启动其中的 Service1 服务。
2、单独启动服务
net start Service1
net start Service2
pause
3、停止服务
net stop Service1
net stop Service2
pause
4、卸载服务
CD /D "%~dp0"
installutil /u WindowsServiceTest.exe
pause
大家可能发现了,除了 Service1,里面还有个 Service2,这就是接下来要讲的安装两个以上服务的方法。(只使用一个服务的话,要把 Service2 删除)
首先按照之前的方法添加 Service2,然后照样添加安装程序,会出现在之前的地方(新增了一个 serviceInstaller2):
接下来打开 Projectlnstaller.Designer.cs 文件,这个是 VS 自动生成的,本来是不需要我们修改的,但这里似乎有一个 bug (参考:《[c# windows 服务 一个进程 多个服务的使用](https://blog.csdn.net/dkdhn/article/details/50126819)》):
就是上图中的红框框住的一句(AddRange 方法中的 this.serviceInstaller2)并没有自动添加上,所以我们手动加上。
然后在程序入口函数 Program.Main () 中添加 Service2 的调用:
这样之后就可以生成程序了,然后以管理员身份运行批处理文件(安装和启动服务.bat):
然后在服务管理页面就可以看到了:
再运行 卸载服务.bat :
程序功能也都生效了:
好了,就说这些了,最后提供下示例代码地址:https://gitee.com/dlgcy/WindowsServiceTest