C#中创建Windows服务需继承ServiceBase类(.NET Framework)或使用Worker Service+UseWindowsService(.NET 6+),通过InstallUtil/sc create安装,由SCM管理启动停止。

在C#中创建Windows服务,核心是继承 ServiceBase 类,并通过安装工具注册到Windows服务管理器。它不是普通控制台或WinForm程序,不能直接双击运行,必须安装后由SCM(服务控制管理器)启动。
一、新建Windows服务项目(.NET Framework)
注意:.NET Core / .NET 5+ 不再原生支持传统Windows服务项目模板,但可通过 Worker Service + Microsoft.Extensions.Hosting.WindowsServices 实现等效功能。以下以经典 .NET Framework 为例(兼容性好、教程多):
- Visual Studio 中新建项目 → 选择“Windows Service (.NET Framework)”
- 默认生成一个继承 ServiceBase 的类(如
Service1.cs) - 在
OnStart()中写启动逻辑(如启动定时器、监听端口、轮询数据库) - 在
OnStop()中释放资源(关闭线程、断开连接、保存状态)
二、关键代码结构示例
以简单日志写入为例:
protected override void OnStart(string[] args)
{
// 启动一个后台线程(或使用Timer),避免阻塞OnStart
_timer = new Timer(WriteLog, null, TimeSpan.Zero, TimeSpan.FromMinutes(1));
}
private void WriteLog(object state)
{
File.AppendAllText(@"C:\Logs\MyService.log",
$"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] Service is running.\r\n");
}
protected override void OnStop()
{
_timer?.Dispose();
}
三、安装与部署服务
仅编译不等于可运行。必须安装才能被系统识别:
- 给项目添加“安装程序”(右键服务设计器 → “添加安装程序”)→ 自动生成
ProjectInstaller.cs - 设置
serviceInstaller1.ServiceName和serviceProcessInstaller1.Account(推荐 LocalSystem 或指定域账户) - 命令行安装(管理员权限运行):
InstallUtil.exe MyService.exe(路径需完整,InstallUtil在C:\Windows\Microsoft.NET\Framework\v4.0.30319\下) - 卸载用:
InstallUtil.exe /u MyService.exe
四、.NET 6/7/8 推荐方式:Worker Service + Windows Services 支持
更现代、跨平台友好的做法:
- 新建“Worker Service”项目(.NET 6+)
- NuGet 安装:
Microsoft.Extensions.Hosting.WindowsServices - 修改
Program.cs:Host.CreateDefaultBuilder(args).UseWindowsService() - 在
Worker.cs的ExecuteAsync中写后台逻辑(支持 DI、配置、日志) - 发布后,用
sc create命令注册:sc create MyWorkerService binPath= "D:\path\MyWorker.exe" start= auto
基本上就这些。核心区别在于:传统方式重在 ServiceBase 生命周期控制;新方式重在 Hosting 模型复用,更轻量、易测试、易维护。










