目录

一、创建服务

1.创建项目(.NET Framework)

 2.重命名

3.编写逻辑代码

 二、安装服务

1.方案一:利用VS2022安装文件的配置

选择添加安装程序

安装文件的介绍及配置

​编辑​ 重新编译

工具安装

2.方案二:编写bat脚本安装服务

 重新编译

创建bat

运行bat 

三、调试服务

1.服务运行的原理

2.调试

(1)建议:定时器间隔小一点,好调试

(2)步骤:

(3)更好的调试方法:

四、卸载服务

方案一:VS2022配置卸载方法

 方案二:bat脚本卸载方法:一停二删


一、创建服务

需求:每隔20秒写一次日志

1.创建项目(.NET Framework)

上面这个是最新的.NET(Core)的服务,我演示的是下面这个Windows服务

如果你没有这个模板,确保你安装了以下的工具:

 2.重命名

改名为MyService,这个只是一个类名,不是最后的服务名,不改也可以:

​ 我还是习惯改一下:

3.编写逻辑代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Threading.Tasks;


namespace WindowsService1
{
    public partial class MyService : ServiceBase
    {
        private Timer _timer;//引用的是using System.Threading;
        private readonly TimeSpan _interval = TimeSpan.FromSeconds(20);//时间间隔20s
        public MyService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)//服务开启自动调用该方法
        {
            _timer = new Timer(WriteTimeToFile, null, TimeSpan.Zero, _interval);//调用WriteTimeToFile方法,传递参数null,启动服务后立即实行一次,间隔20s执行
            File.AppendAllText("log.txt", "服务已开启!\n");
        }

        protected override void OnStop()//服务停止自动调用该方法
        {
            File.AppendAllText("log.txt", "服务已停止!\n");
        }

        private void WriteTimeToFile(object state)
        {
            string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log.txt");//path = 当前目录+"log.txt"
            File.AppendAllText(path, $"{DateTime.Now}: 当前时间记录\n");//写入一定内容(可以写你自己的逻辑)
        }
    }
}

【备注】new System.Threading.Timer(Method, objects, a, b); 这四个参数的含义:

  •     Method: 定时器触发时要调用的方法。
  •     objects: 定时器向Method传递的参数,不传递时可为null。
  •     a(int): 第一次调用定时器的方法之前的延迟时间(毫秒),如果设置为 TimeSpan.Zero,定时器将在创建时立即执行回调方法Method。
  •     b(int) :定时器调用方法的间隔时间(毫秒),如果设置为 TimeSpan.Zero,定时器将仅执行一次,不会重复调用。

 二、安装服务

以下两个安装方案,二选一即可!

1.方案一:利用VS2022安装文件的配置

选择添加安装程序

安装文件的介绍及配置

右键它们两个的属性,分别配置以下内容:

​ 重新编译

安装好后,重新编译该类库

工具安装

 然后使用命令行安装,首先用管理员身份打开cmd,然后输入以下命令进入到安装工具路径:

cd C:\Windows\Microsoft.NET\Framework\v4.0.30319

 执行安装命令(注意改路径)

InstallUtil  F:\C_program\ComputerServices_demo\WindowsService1\WindowsService1\bin\Debug\WindowsService1.exe

测试发现程序正常运行:

2.方案二:编写bat脚本安装服务

 重新编译

首先,重新编译该类库

创建bat

第二,创建一个"安装服务.txt"文件,写入以下内容(二选一即可,记得改路径),然后将后缀改为bat

这里的命名TestService是自由的,如何命名都可以,路径是编译类库后debug输出的exe的路径(注意改路径改和服务名)

@echo off
sc create TestService binPath= "F:\C_program\ComputerServices_demo\WindowsService1\WindowsService1\bin\Debug\WindowsService1.exe" start= auto
sc start TestService
echo Service installed and started.
pause

 更便捷的写法:%~dp0 表示当前目录

@echo off
sc create TestService binPath= "%~dp0WindowsService1.exe" start= auto
sc start TestService
echo Service installed and started.
pause

 

运行bat 

第三步,【右键】-【管理员身份运行】-【安装服务】

出现下图说明安装好了!

三、调试服务

1.服务运行的原理

        将 C# 代码编译成 .exe 文件,并将该 .exe 文件安装为 Windows 服务后,实际运行的是这个 .exe 文件。虽然服务的生命周期由 Windows 服务管理,但服务内部的操作实际上是由 .exe 文件执行的。

        举个例子,爸爸(C#)编写了一个程序,并生成了小明(.exe)。小明去学校(服务),在学校中由老师(Windows 服务)来管理他的上学和放学时间(启停服务)。尽管学校负责管理小明的时间表,但小明在学校里执行的任务(.exe 的代码逻辑)决定了他完成的具体工作或效果。

2.调试

(1)建议:定时器间隔小一点,好调试

(2)步骤:

第一步,停止你的服务

第二步,重新编译你的服务类库(修改代码都要重新编译,重新编译会生成一个新的exe,如果不停止你的服务,将无法生成新的exe!导致编译失败,服务不能正常更新)

 第三步,启动你的服务

 第四步,VS2022附加类库生成的exe到进程,然后断点调试:

成功进入断点:

(3)更好的调试方法:

四、卸载服务

注意,理论上卸载方案二选一即可!推荐方案二,更快更简单~

方案一:VS2022配置卸载方法

 然后使用命令行安装,首先用管理员身份打开cmd,然后输入以下命令进入到安装工具路径:

cd C:\Windows\Microsoft.NET\Framework\v4.0.30319

 执行卸载命令(注意改路径)

InstallUtil  /u F:\C_program\ComputerServices_demo\WindowsService1\WindowsService1\bin\Debug\WindowsService1.exe

管理员身份打开cmd尝试执行,发现已经卸载成功(注意改服务名)

sc delete TestService

 方案二:bat脚本卸载方法:一停二删

 打开服务,停掉这个服务

 管理员身份打开cmd尝试执行,发现已经卸载成功(注意改服务名)

sc delete TestService

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部