C#开发Windows服务完整指南:创建、安装与卸载
Windows服务(原NT服务)允许创建长时间运行的可执行应用程序,支持开机自启、暂停重启且无界面干扰,非常适合服务器端后台任务。本文将演示如何利用C#和Visual Studio创建一个将系统时间写入文件的简单服务,并详细说明如何通过安装组件配置和批处理脚本完成服务的正式部署。
新建Windows服务项目
在Visual Studio中,选择“新建项目”,模板类别定位到“Windows桌面”或对应版本的“Windows服务”项,即可生成基础的服务工程框架。

默认生成的项目中通常包含一个 Services1.cs 类。建议将其删除,重新添加一个新的Windows服务项目文件,以便清晰命名和管理业务逻辑。

核心逻辑实现
进入新服务类的视图代码(View Code),可以看到两个关键的重写方法:OnStart 用于处理服务启动时的初始化工作,OnStop 用于服务停止时的清理工作。以下代码展示了如何在服务生命周期内记录日志:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace MyFirstWindowsService
{
partial class MyWindowsService : ServiceBase
{
public MyWindowsService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
// TODO: Add code here to start your service.
// 打开D盘文件用于追加内容
FileStream fileStream = new FileStream(@"D:\MyWindowsService.txt", FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter streamWriter = new StreamWriter(fileStream);
// 移动流指针到末尾,确保不覆盖原有数据
streamWriter.BaseStream.Seek(0, SeekOrigin.End);
// 写入启动时间与标识
streamWriter.WriteLine("My service started " + DateTime.Now.ToString() + "\n");
streamWriter.Flush();
streamWriter.Close();
fileStream.Close();
}
protected override void OnStop()
{
// TODO: Add code here to perform any tear-down necessary to stop your service.
FileStream fileStream = new FileStream(@"D:\MyWindowsService.txt", FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter streamWriter = new StreamWriter(fileStream);
streamWriter.BaseStream.Seek(0, SeekOrigin.End);
streamWriter.WriteLine("My service stopped " + DateTime.Now.ToString() + "\n");
streamWriter.Flush();
streamWriter.Close();
fileStream.Close();
}
}
}
配置安装程序组件
为了让Windows能够识别并管理此服务,必须添加安装组件。右键点击 MyWindowsService.cs 文件,选择“查看设计器”(View Designer),然后在设计界面空白处右键,选择“添加安装程序”(Add Installer)。
这将在项目中生成 MyWindowsServiceProjectInstaller.cs 文件,其中包含两个核心组件:serviceProcessInstaller1 和 serviceInstaller1。为确保服务能在标准账户下运行(无需管理员特权启动所有服务),需要将 serviceProcessInstaller1 的 Account 属性修改为 LocalService。

此外,检查 serviceInstaller1 的配置:设置 DisplayName 为易读的服务名称(如“ServiceTest”),并确保 StartType 可根据需求设置为“自动”或“手动”。

批处理脚本部署
完成编译后,可以使用 .NET Framework 自带的 installutil.exe 工具进行命令行安装。以下是针对该服务的安装与卸载脚本示例(请根据实际编译输出路径调整文件位置):
安装服务批处理
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe C:\Users\gaoja1\Desktop\MyWindowsService\MyFirstWindowsService\bin\Debug\MyFirstWindowsService.exe
Net Start ServiceTest
sc config ServiceTest start= auto
卸载服务批处理
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u C:\Users\gaoja1\Desktop\MyWindowsService\MyFirstWindowsService\bin\Debug\MyFirstWindowsService.exe
成功执行安装脚本后,在Windows服务列表中即可看到新注册的服务。

启动该服务后,前往D盘目录,可以观察到一个名为 MyWindowsService.txt 的文件,其中记录了服务首次启动的具体时间,证明服务已成功运行。
以上就是C#开发Windows服务及部署的详细内容,更多关于本地部署与服务管理的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













