目录
一、创建服务
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