c#创建windows服务入门教程实例
发布时间:2023-02-24 11:31:31
用c#中创建一个windows服务非常简单,与windows服务相关的类都在System.ServiceProcess命名空间下。
每个服务都需要继承自ServiceBase类,并重写相应的启动、暂停、停止等方法。
windows服务的相关信息是存放与注册表中的,所以他可以在不需要用户登录的情况下自动运行,在c#中你不需要再直接向注册表中添加信息了,c#提供了服务安装类 ServiceProcessInstaller和ServiceInstaller来实现服务的安装。
首先,用vs创建一个windows服务项目
成功后你可以看到
Program中只包含服务运行的相关信息
/// <summary>
/// 应用程序的主入口点。
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service1()//这里是一个数组,意味着我们可以在一个服务进程中创建多个服务实例,只需要在这里加上即可
};
ServiceBase.Run(ServicesToRun);
}
Service1.cs就是我们需要的服务类,与windows服务相关的基本操作大都可以在这里找到,如:Start,Stop,Pause,Continue等,我们要做的就是根据这些操作做不同的处理就可以了。
我们先在服务Start和Stop时分别记录一条信息到D盘
protected override void OnStart(string[] args)
{
File.AppendAllText("d:" + this.GetType().Name + ".txt", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss 服务启动"));
}
protected override void OnStop()
{
File.AppendAllText("d:" + this.GetType().Name + ".txt", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss 服务停止"));
}
一个简单的服务就完成了,下一步添加安装信息
双击项目中的Service.cs转到服务设计界面,在空白处右键选择“添加安装程序”
vs会自动创建一个默认名称为ProjectInstaller.cs的文件并转到相应的设计界面
默认添加两个类 serviceProcessInstaller1和serviceInstaller1,第一个主要用来设置服务所属账户,关系到服务的运行,第二个是服务信息描述,如:服务名、是否自动启动等
右键serviceProcessInstaller1属性,将Account属性选择为LocalSystem
右键serviceInstaller1属性,将StartType属性设为Automatic(自动启动),Description为“我的第一个windows服务”
全部保存后生成,找到生成的程序。
由于windows服务不能通过双击直接运行,所以我们需要借助.net提供的InstallUtil.exe来安装服务。
按回车开始安装,成功后会提示 “提交”阶段已成功完成,如果失败则是“回滚”阶段已成功完成
打开windows服务管理器就能看到我们安装的服务,默认服务安装成功后不会立刻启动,需要我们手动启动
如果不出意外,会显示已启动
到D盘目录下找到Service1.txt,打开会看到我们填入的信息,说明我们做的windows服务已经成功了。
要卸载windows服务可以用InstallUtil.exe /u WindowsService1.exe来卸载或通过系统命令 sc delete 服务名来卸载。


猜你喜欢
- ★打印九九乘法表public class TestDemo { public static
- 项目中遇到springBoot+docker需要配置不同环境变量的问题,做个简单的总结:1.开发环境ide中启动项目可以通过ide的环境变量
- 发展历史Gradle 的依赖管理是一个从开始接触 Android 开发就一直伴随着我们的问题(作者是Andro
- 一、Maven项目使用步骤一般包含两步,1)引入依赖 2)特定的 IDE 引入对应的插件1)在POM中引入依赖<!-- https:/
- 前言Java克隆(Clone)是Java语言的特性之一,但在实际中应用比较少见。但有时候用克隆会更方便更有效率。对于克隆(Clone),Ja
- 《Spring Boot Actuator详解与深入应用》预计包括三篇,第一篇重点讲Spring Boot Actuator 1.x的应用与
- 这一节我们将探索选择器(selectors)。选择器提供选择执行已经就绪的任务的能力,这使得多元 I/O 成为可能。就像在第一章中描述的那样
- android大家都有很多需要用户上传头像的需求,有的是选方形,有的是圆角矩形,有的是圆形。首先我们要做一个处理图片的自定义控件,把传入的图
- 异常处理增强错误恢复能力是提高代码健壮性的最有力的途径之一,C语言中采用的错误处理方法被认为是紧耦合的,函数的使用者必须在非常靠近函数调用的
- 这篇文章主要介绍了基于Java向zip压缩包追加文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 前言最近在学习使用 React Native开发,iOS搞完,开始适配安卓,由于木有接触过安卓,所以碰到了很多问题,第一个问题,安卓的返回键
- 遇到的坑这里我把做这个功能中遇到的一些问题写在前面,是为了大家能先了解有什么问题存在,遇到这些问题的时候就不慌了,这里我把应用图标和名称先统
- Chart折线图使用鼠标滚轮放大、缩小和平移曲线使用鼠标滚轮滚动放大和缩小X轴的宽度,鼠标左键按住拖动实现曲线的左右平移,不再使用滚动条。添
- 1)在我们的项目中添加引用文件:TaskSchedulerEngine.dll(dll定义了一个ITask接口,定义了两个方法Initial
- 如下所示:import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.
- 一、默认静态资源路径类路径下:staticpublicresources这几个目录为默认静态资源访问的目录二、增加静态资源路径前缀动态资源和
- 1.memchrmemchr的函数声明:void *memchr(const void *str, int c, size_t n);作用:
- 前言RadioGroup是继承LinearLayout,只支持横向或者竖向两种布局。所以在某些情况,比如多行多列布局,RadioGroup就
- 前言在Java中,Range方法在IntStream和LongStream类中都可用。在IntStream类中,它有助于返回函数参数范围内I
- package com.cjonline.foundation.cpe.action;import java.io.ByteArrayInp