C#创建Windows Service(Windows 服务)基础教程

news2024/10/7 18:22:33

Windows Service这一块并不复杂,但是注意事项太多了,网上资料也很凌乱,偶尔自己写也会丢三落四的。所以本文也就产生了,本文不会写复杂的东西,完全以基础应用的需求来写,所以不会对Windows Service写很深入。

本文介绍了如何用C#创建、安装、启动、监控、卸载简单的Windows Service 的内容步骤和注意事项。

一、创建一个Windows Service
1)创建Windows Service项目
在这里插入图片描述
2)对Service重命名
将Service1重命名为你服务名称,这里我们命名为ServiceTest。

二、创建服务安装程序
1)添加安装程序
在这里插入图片描述
在这里插入图片描述
之后我们可以看到上图,自动为我们创建了ProjectInstaller.cs以及2个安装的组件。
2)修改安装服务名
右键serviceInsraller1,选择属性,将ServiceName的值改为ServiceTest。
在这里插入图片描述
3)修改安装权限
右键serviceProcessInsraller1,选择属性,将Account的值改为LocalSystem。(如果没有这个步骤在安装的服务的时候会出现输入用户密码的状况)

在这里插入图片描述

三、写入服务代码
1)打开ServiceTest代码
右键ServiceTest,选择查看代码。

2)写入Service逻辑
添加如下代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
 
namespace WindowsServiceTest
{
    public partial class ServiceTest : ServiceBase
    {
        public ServiceTest()
        {
            InitializeComponent();
        }
 
        protected override void OnStart(string[] args)
        {
            using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\log.txt", true))
            {
                sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Start.");
            }
        }
 
        protected override void OnStop()
        {
            using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\log.txt", true))
            {
                sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Stop.");
            }
        }
    }
}

这里我们的逻辑很简单,启动服务的时候写个日志,关闭的时候再写个日志。

四、创建安装脚本
在项目中添加2个文件如下(必须是ANSI或者UTF-8无BOM格式):

1)安装脚本Install.bat

%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe WindowsServiceTest.exe
Net Start ServiceTest
sc config ServiceTest start= auto

2)卸载脚本Uninstall.bat

%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u WindowsServiceTest.exe

3)安装脚本说明
第二行为启动服务。

第三行为设置服务为自动运行。

这2行视服务形式自行选择。

4)脚本调试
如果需要查看脚本运行状况,在脚本最后一行加入pause

五、在C#中对服务进行控制
0)配置目录结构
简历一个新WPF项目,叫WindowsServiceTestUI,添加对System.ServiceProcess的引用。

在WindowsServiceTestUI的bin\Debug目录下建立Service目录。

将WindowsServiceTest的生成目录设置为上面创建的Service目录。

生成后目录结构如下图
在这里插入图片描述
1)安装
安装时会产生目录问题,所以安装代码如下:

string CurrentDirectory = System.Environment.CurrentDirectory;
System.Environment.CurrentDirectory = CurrentDirectory + "\\Service";
Process process = new Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.FileName = "Install.bat";
process.StartInfo.CreateNoWindow = true;
process.Start();
System.Environment.CurrentDirectory = CurrentDirectory;

2)卸载
卸载时也会产生目录问题,所以卸载代码如下:

string CurrentDirectory = System.Environment.CurrentDirectory;
System.Environment.CurrentDirectory = CurrentDirectory + "\\Service";
Process process = new Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.FileName = "Uninstall.bat";
process.StartInfo.CreateNoWindow = true;
process.Start();
System.Environment.CurrentDirectory = CurrentDirectory;

3)启动
代码如下:

using System.ServiceProcess; 
ServiceController serviceController = new ServiceController("ServiceTest");
serviceController.Start();

4)停止

ServiceController serviceController = new ServiceController("ServiceTest");
if (serviceController.CanStop)
    serviceController.Stop();

5)暂停/继续

ServiceController serviceController = new ServiceController("ServiceTest");
if (serviceController.CanPauseAndContinue)
{
    if (serviceController.Status == ServiceControllerStatus.Running)
        serviceController.Pause();
    else if (serviceController.Status == ServiceControllerStatus.Paused)
        serviceController.Continue();
}

6)检查状态

ServiceController serviceController = new ServiceController("ServiceTest");
string Status = serviceController.Status.ToString();

六、调试Windows Service
1)安装并运行服务
2)附加进程
在这里插入图片描述
在这里插入图片描述
3)在代码中加入断点进行调试
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1186687.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot内容协商

1.基于请求头 Accept: application/json Accept: application/xml Accept: application/xxx 自定义数据 发的请求头的数据类型 期望返回的数据类型 2.通过请求参数 例如 /football?formatjson 一般respondbody 默认以json方式进行返回 如何请求同一个接口,可以…

四川芸鹰蓬飞:抖音短视频运营是做什么的?

抖音短视频作为一种新兴的社交媒体平台,它的运营团队肩负着将用户需求与平台资源相结合,促使平台发展壮大的重要任务。抖音短视频运营旨在通过精准的用户分析和有针对性的内容推送,提高用户留存和活跃度,增加广告收入,…

idea使用git删除本地提交(未推送)

1、找到reset head 2、打开弹窗,在HEAD后面输入^ 结果为HEAD^ 注释: Reset Type 有三种: Mixed(默认方式),保留本地源码,回退 commit 和 index 信息,最常用的方式Soft 回退到某个版本…

黑色星期五推广策略:TikTok海外网红营销加速品牌增长

在数字化时代,TikTok已经成为了一个具有巨大潜力的社交媒体平台,它不仅让用户分享短视频,还为品牌提供了一个独特的宣传渠道。尤其是在黑色星期五这个全球购物盛宴的时刻,品牌有机会通过TikTok网红营销来提升销售额。本文Nox聚星将…

搭建 Makefile+OpenOCD+CMSIS-DAP+Vscode arm-none-eabi-gcc 工程模板

STM32F407-GCC-Template Arm-none-eabi-gcc MakefileOpenOCDCMSIS-DAPVscode工程模板 一、本次环境搭建所用的软硬件 1)Windows or Linux (本文以Windows为主) 2)JLink、Daplink、Wch-Link烧录器 3)GNU Arm Embedded Toolchain交叉编译…

Apache Storm 2.5.0 集群安装与配置

1、下载Apache Storm 2.5.0 https://mirrors.tuna.tsinghua.edu.cn/apache/storm/apache-storm-2.5.0/ 2、准备3台服务器 192.168.42.139 node1 192.168.42.140 node1 192.168.42.141 node2 3、配置host [rootnode1 ~]# cat /etc/hosts 127.0.0.1 localhost localhost…

前端缓存机制——强缓存、弱缓存、启发式缓存

强缓存和弱缓存的主要区别是主要区别在于缓存头携带的信息不同。 强缓存: 浏览器发起请求,查询浏览器的本地缓存,如果找到资源,则直接在浏览器中使用该资源。若是未找到,或者资源已过期,则浏览器缓存返回未…

jva智能bi(自助式商业分析)可视化大屏新增功能

jvs智能bi更新说明 新增: 1.数据集定时任务新增前置后置任务功能; 前置后置任务功能允许用户为数据集定时任务添加前置任务和后置任务。前置任务是在主任务执行之前运行的任务,而后置任务是在主任务执行之后运行的任务。通过这种方式,用户…

学习笔记|Pearson皮尔逊相关系数|Spearman斯皮尔曼相关系数|和Kendall肯德尔tau-b相关系数|分析流程|-SPSS中双变量相关性分析系数

目录 学习目的软件版本原始文档基础概念皮尔逊相关系数基本假设(适用条件):系数的范围及意义实例1. 读数据:2.正态性检验:3.异常值检验(体重):4.分析: 斯皮尔曼相关系数基…

内网可达网段探测netspy- Mac环境

netspy是一款快速探测内网可达网段工具 当我们进入内网后想要扩大战果,那我们可能首先想知道当前主机能通哪些内网段。 netspy正是一款应用而生的小工具,体积较小,速度极快,支持跨平台,支持多种协议探测,…

STM32外部中断大问题

问题:一直进入中断,没有触发信号,也一直进入。 描述:开PA0为外部中断,刚刚很好,一个触发信号一个中断,中断函数没有丢,也没有抢跑,开PA1为外部中断也是,都很好…

基于CSP的运动想象 EEG 特征提取和可视化

基于运动想象的公开数据集:Data set IVa (BCI Competition III)1 数据描述参考前文:https://blog.csdn.net/qq_43811536/article/details/134224005?spm1001.2014.3001.5501 EEG 信号时频空域分析参考前文:https://blog.csdn.net/qq_4381153…

十月份 NFT 市场显示复苏迹象,等待进一步的积极发展

作者: stellafootprint.network 10 月份,比特币价格大幅飙升,NFT 市场出现了复苏迹象,月度交易量和用户数均增长了 15.2%。尽管 10 月份的数据相比 9 月份有所改善,但仍然不及 8 月份和之前几个月的水平。因此,现在断…

Cesium 笛卡尔坐标转换

Cesium中主要使用笛卡尔坐标系,球心相当于原点 z轴不是高度,高度是点到地表的距离,贴在表面高度就为0,z改变,x,y都会随之改变; 1.经纬度转笛卡尔 // (经度 纬度 高度),返回的是一个笛卡尔坐标 c…

预约按摩app小程序开发搭建;

预约按摩app小程序开发搭建; 后端:系统后端使用PHP语言开发 前端:前端使用uniapp进行前后端分离开发,支持(公中号、小程序、APP)。 用户端功能模块:技师选择、预约服务、优惠券、订单、技师服…

事件绑定-回调函数

1.事件的概念 2.小程序常用的事件集 2.1 bindtap 点击回调事件方法 2.1.1语法格式 2.1.2 事件处理中调用data 使用setDatacount:这种方式 直接使用this.data.count 2.1.3 事件处理中传参 错误示范: 传递方式:数值用{{}},直接引…

如何使用 GTX750 或 1050 显卡安装 CUDA11+

前言 由于兼容性问题,使得我们若想用较新版本的 PyTorch,通过 GPU 方式训练模型,也得更换较新版本得 CUDA 工具包。然而 CUDA 的版本又与电脑显卡的驱动程序版本关联,如果是低版本的显卡驱动程序安装 CUDA11 及以上肯定会失败。 比…

react之Component存在的2个问题

问题 只要执行setState(),即使不改变状态数据,组件也会重新render()只当前组件重新render(),就会自动重新render子组件 原因 Component中的shouldComponentUpdate()总是返回true 思路 只有当组件的state或props数据发生改变时才重新rend…

c++ 信奥赛编程 2050:【例5.20】字串包含

#include<iostream> #include<cstring> using namespace std; int main() {string str1,str2;int temp;cin>>str1>>str2;//判断长度 if(str1.size()<str2.size()){ swap(str1,str2); //交换内容 }str1str1str1; //AABCDAABCDAABCDAABCDif(str…

苹果转移供应链,促中国手机和中国制造更紧密合作,加速技术升级

随着苹果力推富士康等奔赴印度和越南设厂&#xff0c;引发的另一大反应恐怕是它所没有想到的&#xff0c;那就是中国手机和中国制造产业链的合作更加紧密了&#xff0c;中国制造产业链的技术水平反而因此得到提升。 一、产业链技术升级依赖苹果 对于制造产业链来说&#xff0c;…