首页 > 系统相关 >C#windows 服务 《转载》

C#windows 服务 《转载》

时间:2022-10-28 11:24:31浏览次数:55  
标签:control 服务 C# dll windows new installer 转载

转自: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.补充

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

右键点击工程项目->添加->应用程序清单文件
在这里插入图片描述
修改控制级别为下图所示:在这里插入图片描述

三、总结

  1. 基于以上简单的例子可以了解如何实现一个服务,如何安装、应用服务。服务的入口主要有两个:启动、停止。
  2. windows服务还有以下几个特点:后台运行、即插即用、可开机自动启用,可长时间运行不影响其他在同一个计算机上的用户。
  3. 基于以上了解,感觉服务应该是一个轻量级的东西,解决方案生成的文件没有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.补充

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

右键点击工程项目->添加->应用程序清单文件
在这里插入图片描述
修改控制级别为下图所示:在这里插入图片描述

三、总结

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

标签:control,服务,C#,dll,windows,new,installer,转载
From: https://www.cnblogs.com/joyanli/p/16835183.html

相关文章

  • TPS65217DRSLR TPS65217 便携式设备 电源管理IC 48VQFN
    规格参数型号:TPS65217TPS65217DRSLR应用:电池管理,显示器(LED驱动器),手持/移动设备,电源电流-供电:-电压-供电:2.75V~5.8V工作温度:-40°C~105°C安装类型:表面贴装型封......
  • JDBC-ResultSet基本使用
    ResultSet:结果集对象封装查询结果next():游标向下移动一行判断当前行是否是最后一行末尾(是否有数据)如果是则返回false如果不是则放回truegetxxx(参数):获取数据......
  • React hooks useReducer
    useReducer函数与redux中reducer函数如出一辙。在hooks函数中就是useState函数的替代方案。它接收一个形如(state,action)=>newState的reducer,并返回当前的state以......
  • C#文件路径操作
    System.Environment.CurrentDirectorySystem.IO.Directory.GetCurrentDirectory()这两个方法获得的路径是一样的,获得的是当前路径,这个路径不一定是程序所在的路径。任何会......
  • 动态数组vector的相关用法
    1)头文件#include<vector>2)创建一维vector对象,vector<int>vec;3)尾部插入数字:vec.push_back(a);4)尾部元素弹出:vec.pop_back();相当于删除尾部元素。5)使用下标访问......
  • C#-多线程的使用Tread
    首先是概念,什么是线程?线程是操作系统分配CPU时间的基本单元,在一个进程中可以有多个线程同时执行代码。谈一谈什么是进程?简单的说,一个正在运行的应用程序可以视为一个进......
  • 2021 icpc 沈阳 I 【分式线性变换的保交比性】
    分式线性变换的保交比性对于分式线性变换,具有保交比性应用在复数域下,存在分式线性变换,给定三个输入和输出,再给定第四个输入,求其在这个分式线性变换下的输出。https:/......
  • CF981E Addition on Segments
    \(\text{Solution}\)一道有思维的\(hash\)题,考虑先确定了\(r0\)的长度,那么\(r1\)的长度也就确定了,这样我们可以用\(O(|T|)\)来确定每个\(0\)和\(1\)对应的字符串,可以用字......
  • VSCode-切换焦点时自动保存文件
    设置VSCode切换焦点时自动保存文件什么意思?有时候在VSCode下工作的时候突然需要去做别的事情,比如刚在Explorer窗口中新建了一个文件,但还没保存,这个时候切换到另一个窗......
  • Spring Cloud Netflix SideCar
    ​​PolyglotsupportwithSidecar​​​​spring-cloud-netflix-sidecar​​......