Windows 服务 同时启动多个服务

 Windows 服务 同时启动多个服务

 独立观察员 2019.02.26

最近需要开发 Windows Service 程序,之前没有接触过,所以把了解到的一些东西记录下来。

Windows 服务程序可以简单理解为需要长时间在后台运行, 而又不需要界面显示的程序,在计算机管理 --> 服务和应用程序 --> 服务中可以看到:

32c741a0511836631b3c636ce85300f5.png

我们先来新建一个 "Windows 服务" 项目,具体可参考《C# 编写 Windows Service(windows 服务程序)》(https://www.cnblogs.com/bluestorm/p/3510398.html)一文。

逻辑写在继承于 ServiceBase 类的类中,该类型的类通过添加 "Windows 服务" 来生成:

986ab97dd2c7929f07ad95240d1358a0.png

双击生成的类文件,打开的是一个设计页面,可点击切换到代码视图:

9006332383d9e85dce3ede6e4da93769.png

代码视图中可以看到,是继承于 ServiceBase 类的,主要逻辑写在 OnStart 和 OnStop 方法中:

82d7c923ecb5c8968d4384fc66e2d9bd.png

在 Service1 的设计页面右键 -->"添加安装程序",生成 ProjectInstaller.cs ,也是个设计页面,包含一个 serviceProcessInstaller1 组件和一个 serviceInstaller1 组件:

c83e03f36419a0d3a4bac870694b26ed.png

其中 serviceProcessInstaller1 属性中一般将 Account 的值改为 LocalSystem :

b882ca43d79bdddbd16fb2582dd2f1dd.png

而 serviceInstaller1 的属性中,Description 是描述信息,DisplayName 是显示的名称,都在开头提到的系统服务管理页面中显示。ServiceName 指定了程序中使用该服务要用的名称。StartType 一般选为 Automatic,代表了自动启动:

9d66c0f08037ac226fa59e7e1dc4d861.png

然后就是安装和启动了,有好几种方法,本文采用 InstallUtil.exe 和 批处理 结合的方式。InstallUtil.exe 命令行工具在 % SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe 路径下,可以直接带路径使用,也可以拷到项目中使用。

下面给出批出理代码:

  1. 安装和启动服务

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):

f940af217ac0978e94a53c4c72304656.png

接下来打开 Projectlnstaller.Designer.cs 文件,这个是 VS 自动生成的,本来是不需要我们修改的,但这里似乎有一个 bug (参考:《[c# windows 服务 一个进程 多个服务的使用](https://blog.csdn.net/dkdhn/article/details/50126819)》):

a9351a40363bb8d84c36f0eb5b108566.png

就是上图中的红框框住的一句(AddRange 方法中的 this.serviceInstaller2)并没有自动添加上,所以我们手动加上。

然后在程序入口函数 Program.Main () 中添加 Service2 的调用:

765b6ee7cf87227a3e4c4af40ff6c53b.png

这样之后就可以生成程序了,然后以管理员身份运行批处理文件(安装和启动服务.bat):

583daa4136e6db01e1593646dabef0e2.png

然后在服务管理页面就可以看到了:

e937880f86ac44d3e535f4f15750fc0e.png

再运行 卸载服务.bat :

1cc9a5ac05d63c1c890c834f96faadfb.png

程序功能也都生效了:

c76fe79b48b20c0c717ca1b03963c8a8.png

好了,就说这些了,最后提供下示例代码地址:https://gitee.com/dlgcy/WindowsServiceTest 

技术群:添加小编微信并备注进群

小编微信:mm1552923   

公众号:dotNet编程大全    


.NET

PostSharp 中 AOP 功能的简单使用

.NET SDK-Style 项目(Core、Standard、.NET5)中的版本号

将 .NET Framework 项目转换为 .NET Standard 项目

ASP.NET Core MVC 网站学习笔记

Unity 容器简单使用方法

Unity容器依赖注入之属性注入使用备忘

添加服务引用来使用WebService

Windows

Windows 11 及其安卓子系统折腾记

IIS 错误解决:当前标识没有对 Temporary ASP.NET Files 的写访问权限

台式机插 4G上网卡后供给其它设备内外网

搭建 Frp 来远程内网 Windows 和 Linux 机子

Windows 端最稳定的 DLNA音乐播放器推荐

Windows可登陆的本地账户忘记密码的解决方法

使用 ngrok 从外网连接内网的远程桌面

其它

在香蕉派的树莓派系统上配置 Syncthing 自启动(暨 Linux 软件自启服务配置)

使用 GB28181.Solution + ZLMediaKit + MediaServerUI 进行摄像头推流和播放

如何快速剥火腿肠皮?

使用 Floccus 插件和坚果云同步 Chrome 类浏览器书签

Docker Hub 使用初探

『独立观察员』个人观影 Ⅱ

VisualStudio 使用 DialogPage 存储配置信息

分页SQL语句

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值