第一个 Windows Service

一、新建 Windows 服务项目

  1. 打开 Visual Studio,新建项目
  2. 模板选择:Visual C# → Windows → Windows 服务
  3. 设置项目名称、保存路径,点击确定

注意:新版VS高版本不再内置此模板,.NET Framework 才支持该模板;.NET Core/.NET 5+推荐使用 Worker Service

二、项目结构说明

自动生成核心文件:

  1. Program.cs:程序入口
  2. Service1.cs:服务主体逻辑类
1. Program.cs 入口代码
static class Program
{
    static void Main()
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[]
        {
            new Service1()
        };
        ServiceBase.Run(ServicesToRun);
    }
}Code language: JavaScript (javascript)

作用:启动服务容器,加载一个或多个服务实例。

2. Service1.cs 服务主类
public partial class Service1 : ServiceBase
{
    public Service1()
    {
        InitializeComponent();
    }

    // 【服务启动时执行】
    protected override void OnStart(string[] args)
    {

    }

    // 【服务停止时执行】
    protected override void OnStop()
    {

    }
}
  • OnStart:服务启动触发,业务逻辑写在这里
  • OnStop:服务停止触发,用来释放资源

三、添加安装程序

这一步是必须!否则无法注册到系统服务。

操作步骤
  1. Service1 的设计视图界面,右键 → 添加安装程序
  2. VS自动生成 ProjectInstaller.cs,包含两个核心组件:
    • serviceInstaller1
    • serviceProcessInstaller1

组件属性配置

  1. serviceInstaller1(服务信息配置)
    • ServiceName:内部服务名(代码中标识)
    • DisplayName:服务管理器显示名称
    • Description:服务描述
    • StartType:启动类型 Manual(手动)/Automatic(自动)
  2. serviceProcessInstaller1(运行账户配置)
    • Account:运行身份
    • LocalSystem:本地系统账户(权限最高,推荐测试使用)
    • User:指定Windows账号(默认,需要填写账号密码)

四、编写测试业务逻辑

业务执行,就在Service1里面,读者可以把你的业务逻辑放到这里,为了验证是否生效,我们这里用日志输出的方式来测试,这是临时的,因为服务是不好调试的。需要安装卸载的。

修改 Service1.cs

using System.IO;

protected override void OnStart(string[] args)
{
    // 启动写入日志
    File.AppendAllText("log.txt", "启动时间:" + DateTime.Now + Environment.NewLine);
}

protected override void OnStop()
{
    // 停止写入日志
    File.AppendAllText("log.txt", "停止时间:" + DateTime.Now + Environment.NewLine);
}Code language: JavaScript (javascript)

五、编译、安装、启动服务

  1. 编译项目,获取 WindowsServiceDemo.exe
  2. 使用 InstallUtil.exe 注册服务(管理员CMD)
# 安装服务
InstallUtil.exe WindowsServiceDemo.exe

# 卸载服务
InstallUtil.exe /u WindowsServiceDemo.exeCode language: PHP (php)
  1. 打开服务管理器 services.msc,找到服务名称,启动/停止服务查看日志。

服务不能像其他程序那样运行,调试等等,需要调用工具来进行安装的。

注意

  1. 不能直接F5调试:Windows服务无法直接启动调试,推荐方案:
    增加双模式判断;命令行运行时作为控制台程序,安装后作为服务运行。
  2. 路径问题:相对路径失效,优先绝对路径。
  3. 权限问题:账户身份决定能否访问磁盘、网络、共享文件夹。
  4. 启动超时OnStart 长时间阻塞会造成系统判定服务启动失败,耗时任务建议新开线程执行。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注