转自: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. ABAP 拆批拣货交货bapi以及实例

    使用函数 BAPI_OUTB_DELIVERY_CHANGE:拆批bapi WS_DELIVERY_UPDATE:拣货函数 BAPI_OUTB_DELIVERY_CONFIRM_DEC:过账函数 样例 ...

  2. vue实现随机生成图形验证码

    效果展示 安装插件 npm i identify 定义组件 verificationCode.vue <template> <!-- 图形验证码 --> <div cla ...

  3. 力扣(leetcode)题库0001-python3

    试一下leetcode的题库,不知道对于我这种小白要多长时,但是目标已经种下,去做就是了.You can do anything you set your mind to. 题目:题库链接 中:给定一 ...

  4. H5移动端跳转唤起QQ在线客服与跳转支付宝

    以下两段代码都是找了很久的,在某个删库跑路的支付商那里找到的! H5移动端跳转QQ 实现在线客服 <a href="mqqwpa://im/chat?chat_type=wpa& ...

  5. Centos操作系统在虚拟机VMware上的安装(二)

    a:hover { color: rgba(255, 102, 0, 1) } 1.下载centos操作系统,提供百度云盘链接:http://pan.baidu.com/s/1pLHOR03 2.打开 ...

  6. iOS开发之UIImage在压缩时失真问题,压缩图片的大小

    今天遇到UIImage在压缩时失真问题,压缩图片的大小图片模糊 错误的方案 /** * 压缩图片 * image:将要压缩的图片 size:压缩后的尺寸 */ -(UIImage*) OriginIm ...

  7. element中 popconfirm与tooltip同时使用

    el-popconfirm与el-tooltip同时使用 代码 <el-popconfirm confirmButtonText="确定" cancelButtonText= ...

  8. Excel列动态导出

    列动态导出的Excel,大致整了一下,没有过多深入. 1.首先定义列样式 package a.b.common.util.excel.stream; import java.util.Objects; ...

  9. JavaScript案例:倒计时

    展示效果: 代码示例: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  10. myod od -tx -tc功能的c语言实现1210

    一.实验要求 1. 复习c文件处理内容: 2. 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能: 3. main与其他分开,制作静态库和动态库: 4. 编写Ma ...