C#windows 服务 《转载》
转自:https://blog.csdn.net/Code_May/article/details/123909870
c#应用Windows服务
背景
最近接到了一个有关进程通信的项目,主要实现的是客户的控制系统进程通过我们提供的接口向我们的软件发送消息执行动作,实现一个自动化的控制过程。通信模块主要是基于ZeroMQ实现的,在方案评审中大佬提出了,如果将通信模块直接加入我们的主工程会导致我们的软件和客户的进程耦合度较高。因此,需要添加一个中间层,将通信模块做成一个服务,然后提供一个单独的dll提供业务服务的接口。后续对接时,如果有业务上的变更,只需要维护这个dll即可。(说实话其实只理解了一半,具体这个服务和这个dll有什么关系还需要进一步了解windows服务这个东西之后才能有粗略的概念)
一、创建windows服务
1.创建windows服务工程项

2.修改服务的实现文件service1.cs

这个是创建工程之后自动生成的服务实现文件,需要重写void OnStart(string[] args)和void OnStop()函数,实现启动服务和停止服务的具体内容。
3.配置服务信息
- 双击cs文件进入设计界面
- 右键点击空白处,添加安装程序,可以看到新加入的projectinstaller.cs

- 将serviceProcessInstaller1的属性中的账户类型设置为localsystem

- 修改服务名称和服务描述

以上就完成了服务的编写,在安装该服务后,启用该服务、停止该服务会调用对应的函数。另说明:该服务工程项目编译完成后是一个exe,在安装时需要使用这个exe的路径。
二、安装、启动、停止、卸载服务
以下的serviceFilePath为服务的exe路径
1.安装服务
using (AssemblyInstaller installer = new AssemblyInstaller())
{
installer.UseNewContext = true;
installer.Path = serviceFilePath;
IDictionary savedState = new Hashtable();
installer.Install(savedState);
installer.Commit(savedState);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
2.启动服务
using (ServiceController control = new ServiceController(serviceName))
{
if (control.Status == ServiceControllerStatus.Stopped)
{
control.Start();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
3.停止服务
using (ServiceController control = new ServiceController(serviceName))
{
if (control.Status == ServiceControllerStatus.Running)
{
control.Stop();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
4.卸载服务
using (AssemblyInstaller installer = new AssemblyInstaller())
{
installer.UseNewContext = true;
installer.Path = serviceFilePath;
installer.Uninstall(null);
}
- 1
- 2
- 3
- 4
- 5
- 6
5.补充
由于操作服务需要一定的计算机访问权限,所以需要给安装服务的工程项目中添加一个应用程序清单文件,设置应用程序的访问权限。
右键点击工程项目->添加->应用程序清单文件

修改控制级别为下图所示:
三、总结
- 基于以上简单的例子可以了解如何实现一个服务,如何安装、应用服务。服务的入口主要有两个:启动、停止。
- windows服务还有以下几个特点:后台运行、即插即用、可开机自动启用,可长时间运行不影响其他在同一个计算机上的用户。
- 基于以上了解,感觉服务应该是一个轻量级的东西,解决方案生成的文件没有dll。应用方式应该是将服务与dll关联起来,让程序能够动态的加载这个模块(以上是个人猜想,后续可以再深入了解一下将dll注册到服务里的相关内容,理解这样的方式是解决什么问题的,需要哪些步骤)。
c#应用Windows服务
背景
最近接到了一个有关进程通信的项目,主要实现的是客户的控制系统进程通过我们提供的接口向我们的软件发送消息执行动作,实现一个自动化的控制过程。通信模块主要是基于ZeroMQ实现的,在方案评审中大佬提出了,如果将通信模块直接加入我们的主工程会导致我们的软件和客户的进程耦合度较高。因此,需要添加一个中间层,将通信模块做成一个服务,然后提供一个单独的dll提供业务服务的接口。后续对接时,如果有业务上的变更,只需要维护这个dll即可。(说实话其实只理解了一半,具体这个服务和这个dll有什么关系还需要进一步了解windows服务这个东西之后才能有粗略的概念)
一、创建windows服务
1.创建windows服务工程项

2.修改服务的实现文件service1.cs

这个是创建工程之后自动生成的服务实现文件,需要重写void OnStart(string[] args)和void OnStop()函数,实现启动服务和停止服务的具体内容。
3.配置服务信息
- 双击cs文件进入设计界面
- 右键点击空白处,添加安装程序,可以看到新加入的projectinstaller.cs

- 将serviceProcessInstaller1的属性中的账户类型设置为localsystem

- 修改服务名称和服务描述

以上就完成了服务的编写,在安装该服务后,启用该服务、停止该服务会调用对应的函数。另说明:该服务工程项目编译完成后是一个exe,在安装时需要使用这个exe的路径。
二、安装、启动、停止、卸载服务
以下的serviceFilePath为服务的exe路径
1.安装服务
using (AssemblyInstaller installer = new AssemblyInstaller())
{
installer.UseNewContext = true;
installer.Path = serviceFilePath;
IDictionary savedState = new Hashtable();
installer.Install(savedState);
installer.Commit(savedState);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
2.启动服务
using (ServiceController control = new ServiceController(serviceName))
{
if (control.Status == ServiceControllerStatus.Stopped)
{
control.Start();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
3.停止服务
using (ServiceController control = new ServiceController(serviceName))
{
if (control.Status == ServiceControllerStatus.Running)
{
control.Stop();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
4.卸载服务
using (AssemblyInstaller installer = new AssemblyInstaller())
{
installer.UseNewContext = true;
installer.Path = serviceFilePath;
installer.Uninstall(null);
}
- 1
- 2
- 3
- 4
- 5
- 6
5.补充
由于操作服务需要一定的计算机访问权限,所以需要给安装服务的工程项目中添加一个应用程序清单文件,设置应用程序的访问权限。
右键点击工程项目->添加->应用程序清单文件

修改控制级别为下图所示:
三、总结
- 基于以上简单的例子可以了解如何实现一个服务,如何安装、应用服务。服务的入口主要有两个:启动、停止。
- windows服务还有以下几个特点:后台运行、即插即用、可开机自动启用,可长时间运行不影响其他在同一个计算机上的用户。
- 基于以上了解,感觉服务应该是一个轻量级的东西,解决方案生成的文件没有dll。应用方式应该是将服务与dll关联起来,让程序能够动态的加载这个模块(以上是个人猜想,后续可以再深入了解一下将dll注册到服务里的相关内容,理解这样的方式是解决什么问题的,需要哪些步骤)。
C#windows 服务 《转载》的更多相关文章
- 基于SignalR实现B/S系统对windows服务运行状态的监测
通常来讲一个BS项目肯定不止单独的一个BS应用,可能涉及到很多后台服务来支持BS的运行,特别是针对耗时较长的某些任务来说,Windows服务肯定是必不可少的,我们还需要利用B/S与windows服务进 ...
- C#创建、安装、卸载、调试Windows Service(Windows 服务)的简单教程
前言:Microsoft Windows 服务能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这 ...
- 玩转Windows服务系列汇总
玩转Windows服务系列汇总 创建Windows服务 Debug.Release版本的注册和卸载及其原理 无COM接口Windows服务启动失败原因及解决方案 服务运行.停止流程浅析 Windows ...
- 玩转Windows服务系列——给Windows服务添加COM接口
当我们运行一个Windows服务的时候,一般情况下,我们会选择以非窗口或者非控制台的方式运行,这样,它就只是一个后台程序,没有界面供我们进行交互. 那么当我们想与Windows服务进行实时交互的时候, ...
- 玩转Windows服务系列——使用Boost.Application快速构建Windows服务
玩转Windows服务系列——创建Windows服务一文中,介绍了如何快速使用VS构建一个Windows服务.Debug.Release版本的注册和卸载,及其原理和服务运行.停止流程浅析分别介绍了Wi ...
- 玩转Windows服务系列——Debug、Release版本的注册和卸载,及其原理
Windows服务Debug版本 注册 Services.exe -regserver 卸载 Services.exe -unregserver Windows服务Release版本 注册 Servi ...
- C# 开发windows服务的一些心得
最近在做一个windows服务的项目,发现并解决了一些问题,拿出来和大家分享一下,以下windows服务简称“服务” 文章会在适合时间更新,因为朋友们在不断提出新的意见或思路,感谢-.- 1.服务如何 ...
- 使用topshelf包装redis为windows服务
Redis服务端目前用的是控制台程序运行,部署的时候能作为windows服务后台运行感觉更好.找到一篇文章Running Redis as a Windows Service,利用win ...
- 编写Windows服务疑问1:操作过程
Windows 服务开发平时不太受人关注,毕竟那是高大上的项目类型,平常需求也用不上,很多老掉牙的家伙也只知有WinForm,仍不知有WPF,更别说Windows 服务了,正如陶渊明所写的,“不知有汉 ...
- C# windows服务制作(包括安装及卸载)
开篇语 因工作内容需要做一个windows服务,此前并没有相关经验,所以做了一个demo来跑跑这个梗(高手跳过,需要的来踩)- 效果如下:打开服务,可以找到我们新增的一个windows服务,这个dem ...
随机推荐
- CMT: Convolutional Neural Networks Meet Vision Transformers概述
0.前言 相关资料: arxiv github 论文解读(CSDN,CSDN) 论文基本信息: 作者单位:华为诺亚, 悉尼大学 发表时间:CVPR2022(2021.7.13) 1.针对的问题 当前将 ...
- Solidity8.0-01
对应崔棉大师 1-25课程https://www.bilibili.com/video/BV1yS4y1N7yu/?spm_id_from=333.788&vd_source=c81b130b ...
- TensorFlow中使用tf.keras.callbacks.EarlyStopping防止训练过拟合
TensorFlow tf.keras.callbacks.EarlyStopping 当模型训练次数epoch设置到100甚至更大时,如果模型的效果没有进一步提升,那么训练可以提前停止,继续训练很可 ...
- String、StringBuffer、StringBuilder他们的区别
String.StringBuffer.StringBuilder他们的区别 String: String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,然后将指针新的对 ...
- H5移动端跳转唤起QQ在线客服与跳转支付宝
以下两段代码都是找了很久的,在某个删库跑路的支付商那里找到的! H5移动端跳转QQ 实现在线客服 <a href="mqqwpa://im/chat?chat_type=wpa& ...
- 硬件IIC的重映射使用问题
目录 沁恒的蓝牙系列芯片,有映射硬件模块去其他引脚的功能,可以配置各芯片的功能引脚重映射寄存器(R16_PIN_ALTERNATE),或者使用函数GPIOPinRemap函数进行配置. 比如说想要配置 ...
- linux 中EOF用法
EOF是END Of File的缩写,表示自定义终止符.既然自定义,那么EOF就不是固定的,可以随意设置别名,在linux按ctrl-d就代表EOF.EOF一般会配合cat能够多行文本输出.其用法如下 ...
- Centos7忘记root密码,修改root密码及其他用户密码
具体步骤: 1.重启系统,在开机过程中,快速按下方向键↑和↓.在引导程序页面暂停. 2.选择第一行(背景高亮即为选中),按下键盘上的e,进入编辑模式 3.将光标一直移动到 LANG=en_US.UTF ...
- linux 清空catalina.out日志 不需要重启tomcat(五种方法)
linux 清空catalina.out日志 不需要重启tomcat 1.重定向方法清空文件 [root@localhost logs]# du -h catalina.out 查看文件大小17 ...
- 【解决】Mac无法通过smb连接到windows的共享文件夹
通过Mac访问windows的共享文件夹也有很多博文都写了,这里不再提. 先按照网上教程,在Windows下允许远程,然后设置文件夹共享出来,再在Mac上通过smb登录,输入用户名和密码窗口总是抖动, ...