一、新建 Windows 服务项目
- 打开 Visual Studio,新建项目
- 模板选择:Visual C# → Windows → Windows 服务
- 设置项目名称、保存路径,点击确定
注意:新版VS高版本不再内置此模板,.NET Framework 才支持该模板;.NET Core/.NET 5+推荐使用
Worker Service。
二、项目结构说明
自动生成核心文件:
- Program.cs:程序入口
- 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:服务停止触发,用来释放资源
三、添加安装程序
这一步是必须!否则无法注册到系统服务。
操作步骤
- 在
Service1的设计视图界面,右键 → 添加安装程序 - VS自动生成
ProjectInstaller.cs,包含两个核心组件:serviceInstaller1serviceProcessInstaller1

组件属性配置
- serviceInstaller1(服务信息配置)
ServiceName:内部服务名(代码中标识)DisplayName:服务管理器显示名称Description:服务描述StartType:启动类型Manual(手动)/Automatic(自动)
- 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)
五、编译、安装、启动服务
- 编译项目,获取
WindowsServiceDemo.exe - 使用
InstallUtil.exe注册服务(管理员CMD)
# 安装服务
InstallUtil.exe WindowsServiceDemo.exe
# 卸载服务
InstallUtil.exe /u WindowsServiceDemo.exeCode language: PHP (php)
- 打开服务管理器
services.msc,找到服务名称,启动/停止服务查看日志。
服务不能像其他程序那样运行,调试等等,需要调用工具来进行安装的。
注意
- 不能直接F5调试:Windows服务无法直接启动调试,推荐方案:
增加双模式判断;命令行运行时作为控制台程序,安装后作为服务运行。 - 路径问题:相对路径失效,优先绝对路径。
- 权限问题:账户身份决定能否访问磁盘、网络、共享文件夹。
- 启动超时:
OnStart长时间阻塞会造成系统判定服务启动失败,耗时任务建议新开线程执行。
Previous: Windows 服务
Next: 服务的安装和卸载