转自:https://blog.csdn.net/Code_May/article/details/123909870

背景

最近接到了一个有关进程通信的项目,主要实现的是客户的控制系统进程通过我们提供的接口向我们的软件发送消息执行动作,实现一个自动化的控制过程。通信模块主要是基于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.补充

由于操作服务需要一定的计算机访问权限,所以需要给安装服务的工程项目中添加一个应用程序清单文件,设置应用程序的访问权限。

右键点击工程项目->添加->应用程序清单文件

修改控制级别为下图所示:

三、总结

  1. 基于以上简单的例子可以了解如何实现一个服务,如何安装、应用服务。服务的入口主要有两个:启动、停止。
  2. windows服务还有以下几个特点:后台运行、即插即用、可开机自动启用,可长时间运行不影响其他在同一个计算机上的用户。
  3. 基于以上了解,感觉服务应该是一个轻量级的东西,解决方案生成的文件没有dll。应用方式应该是将服务与dll关联起来,让程序能够动态的加载这个模块(以上是个人猜想,后续可以再深入了解一下将dll注册到服务里的相关内容,理解这样的方式是解决什么问题的,需要哪些步骤)。
 

背景

最近接到了一个有关进程通信的项目,主要实现的是客户的控制系统进程通过我们提供的接口向我们的软件发送消息执行动作,实现一个自动化的控制过程。通信模块主要是基于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.补充

由于操作服务需要一定的计算机访问权限,所以需要给安装服务的工程项目中添加一个应用程序清单文件,设置应用程序的访问权限。

右键点击工程项目->添加->应用程序清单文件

修改控制级别为下图所示:

三、总结

  1. 基于以上简单的例子可以了解如何实现一个服务,如何安装、应用服务。服务的入口主要有两个:启动、停止。
  2. windows服务还有以下几个特点:后台运行、即插即用、可开机自动启用,可长时间运行不影响其他在同一个计算机上的用户。
  3. 基于以上了解,感觉服务应该是一个轻量级的东西,解决方案生成的文件没有dll。应用方式应该是将服务与dll关联起来,让程序能够动态的加载这个模块(以上是个人猜想,后续可以再深入了解一下将dll注册到服务里的相关内容,理解这样的方式是解决什么问题的,需要哪些步骤)。
 

C#windows 服务 《转载》的更多相关文章

  1. 基于SignalR实现B/S系统对windows服务运行状态的监测

    通常来讲一个BS项目肯定不止单独的一个BS应用,可能涉及到很多后台服务来支持BS的运行,特别是针对耗时较长的某些任务来说,Windows服务肯定是必不可少的,我们还需要利用B/S与windows服务进 ...

  2. C#创建、安装、卸载、调试Windows Service(Windows 服务)的简单教程

    前言:Microsoft Windows 服务能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这 ...

  3. 玩转Windows服务系列汇总

    玩转Windows服务系列汇总 创建Windows服务 Debug.Release版本的注册和卸载及其原理 无COM接口Windows服务启动失败原因及解决方案 服务运行.停止流程浅析 Windows ...

  4. 玩转Windows服务系列——给Windows服务添加COM接口

    当我们运行一个Windows服务的时候,一般情况下,我们会选择以非窗口或者非控制台的方式运行,这样,它就只是一个后台程序,没有界面供我们进行交互. 那么当我们想与Windows服务进行实时交互的时候, ...

  5. 玩转Windows服务系列——使用Boost.Application快速构建Windows服务

    玩转Windows服务系列——创建Windows服务一文中,介绍了如何快速使用VS构建一个Windows服务.Debug.Release版本的注册和卸载,及其原理和服务运行.停止流程浅析分别介绍了Wi ...

  6. 玩转Windows服务系列——Debug、Release版本的注册和卸载,及其原理

    Windows服务Debug版本 注册 Services.exe -regserver 卸载 Services.exe -unregserver Windows服务Release版本 注册 Servi ...

  7. C# 开发windows服务的一些心得

    最近在做一个windows服务的项目,发现并解决了一些问题,拿出来和大家分享一下,以下windows服务简称“服务” 文章会在适合时间更新,因为朋友们在不断提出新的意见或思路,感谢-.- 1.服务如何 ...

  8. 使用topshelf包装redis为windows服务

           Redis服务端目前用的是控制台程序运行,部署的时候能作为windows服务后台运行感觉更好.找到一篇文章Running Redis as a Windows Service,利用win ...

  9. 编写Windows服务疑问1:操作过程

    Windows 服务开发平时不太受人关注,毕竟那是高大上的项目类型,平常需求也用不上,很多老掉牙的家伙也只知有WinForm,仍不知有WPF,更别说Windows 服务了,正如陶渊明所写的,“不知有汉 ...

  10. C# windows服务制作(包括安装及卸载)

    开篇语 因工作内容需要做一个windows服务,此前并没有相关经验,所以做了一个demo来跑跑这个梗(高手跳过,需要的来踩)- 效果如下:打开服务,可以找到我们新增的一个windows服务,这个dem ...

随机推荐

  1. JetBrains之全家桶破解

    JetBrains之全家桶破解(idea,rider....) 链接之....JETBRA.IN 打开上面的链接 随便点击下图中一个可用的链接,进入之后看下一步. 打开上一步的链接之后,下载下图中红框 ...

  2. k8s ingress 报错整理

    问题: Error from server (InternalError): error when creating "ingress-rules-demo1.yaml": Int ...

  3. Property or method "scope" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components

    报错如下 属性或方法"范围"不是在实例上定义的,而是在呈现期间引用的. 通过初始化属性,确保此属性是反应性的,无论是在数据选项中,还是对于基于类的组件. 原因在template中未 ...

  4. chrome调试秘籍,让你的开发速度飞起来

    前言 熟练使用调试工具,势必能大幅提高我们的开发效率,达到事半功倍的效果.废话不多说,直接进入主题. Filter过滤 过滤器最简单的用法当然是直接输入过滤的字符,但这远远不够.除了直接输入,我们还希 ...

  5. 以EEPROM为例的硬件IIC的使用

    目录 参考调试MPU6050与EEPROM的经验,整合了目标内存/寄存器地址是否为16位的情况,合并了单字节与多字节间的操作,添加了返回值与读写超时功能:硬件IIC的7位从机地址查询方式读写参考代码 ...

  6. 072_关于Dataloader导入Record的创建时间及修改时间并允许owner是Inactive

    1.在User interface 中 启用 Enable "Set Audit Fields upon Record Creation" and "Update Rec ...

  7. JS form表单数据校验及失效情况下的解决方案

    如下图,当执行提交操作之前,我们需要对序号,要求完成时间,责任人,措施内容四项进行非空,字符长度及输入内容的类型进行校验. 直接贴样式代码 <div class="wrapper an ...

  8. vs 工具 dumpbin & corflags

    dumpbin 查看 dll 接口函数 > dumpbin /exports "/path/to/dll" dumpbin 查看 exe.dll 依赖的动态库 > du ...

  9. springboot aop本地缓存防止重复提交

    实现原理: 自定义防止重复提交标记(@RepeatSubmit). 对需要防止重复提交的Congtroller里的mapping方法加上该注解. 新增Aspect切入点,为@RepeatSubmitA ...

  10. 2023最新版Selenium 4.6.0语法快速入门

    简介 Selenium是一款强而有力的前端应用测试工具,也非常适合搭配Python作为网络爬虫的工具:Selenium可以模拟使用者所有浏览器操作的动作,包括输入文本.点击按钮及拖拽进度条等.有鑑于新 ...