新闻中心

C# 怎么创建一个 Windows 服务_C# Windows 服务创建与部署指南

2025-11-09
浏览次数:
返回列表
答案:使用.NET 6 Worker Service模板创建Windows服务,通过添加Microsoft.Extensions.Hosting.WindowsServices包并配置宿主模型,实现后台任务运行;部署时用sc命令安装并设置开机自启,开发阶段可通过控制台调试,日志建议输出到文件或事件日志。

c# 怎么创建一个 windows 服务_c# windows 服务创建与部署指南

创建一个 Windows 服务在 C# 中并不复杂,但需要理解其运行机制和部署流程。Windows 服务是在后台运行的长期进程,适合执行定时任务、监控系统或托管长时间运行的服务逻辑。下面是一个完整的创建与部署指南。

创建 Windows 服务项目

打开 Visual Studio,按照以下步骤新建项目:

  • 选择“创建新项目”
  • 搜索并选择“Windows 服务 (.NET Framework)”模板(注意:目前原生 .NET/.NET Core/.NET 5+ 的 Windows 服务需手动配置,推荐使用 .NET 6 或以上版本配合 Worker Service 模板)
  • 命名项目,例如 MyWinService

如果你使用的是 .NET 6 或更高版本,建议选择“Worker Service”模板,它更适合现代 Windows 服务开发,并支持跨平台。

编写服务逻辑(以 .NET 6 Worker Service 为例)

Program.cs 中,使用内置的宿主模型来注册后台服务:

builder.Services.AddHostedService();

Worker.cs 文件中实现你的业务逻辑:

public class Worker : BackgroundService
{
private readonly ILogger _logger;

public Worker(ILogger<Worker> logger)  
{  
    _logger = logger;  
}  

protected override async Task ExecuteAsync(CancellationToken stoppingToken)  
{  
    while (!stoppingToken.IsCancellationRequested)  
    {  
        _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);  
        await Task.Delay(1000, stoppingToken); // 每秒执行一次  
    }  
}  

}

这个 Worker 类继承自 BackgroundService,会在服务启动时自动调用 ExecuteAsync 方法。

将应用配置为 Windows 服务

要让 .NET 应用作为 Windows 服务运行,需要添加 NuGet 包并修改宿主配置。

  • 安装 NuGet 包:Microsoft.Extensions.Hosting.WindowsServices

修改 Program.cs,启用 Windows 服务支持:

var isService = !string.IsNullOrEmpty(Environment.GetCommandLineArgs().FirstOrDefault(arg => arg.ToLower() == "--windows-service"));

var builder = Host.CreateApplicationBuilder(args);

if (isService)
{
builder.Services.AddWindowsService(options =>
{
options.ServiceName = "MySampleWinService";
});
}
else
{
builder.Services.AddConsoleLifetime();
}

builder.Services.AddHostedService();

var host = builder.Build();

易标AI 易标AI

告别低效手工,迎接AI标书新时代!3分钟智能生成,行业唯一具备查重功能,自动避雷废标项

易标AI 135 查看详情 易标AI

await host.RunAsync();

这样,当应用以服务方式运行时,会自动识别并注册为 Windows 服务。

发布与部署服务

完成开发后,发布项目并部署为服务:

  • 右键项目 → “发布” → 选择文件夹发布路径(如 C:\MyServices\MyWinService
  • 使用 sc 命令行工具安装服务:

sc create MySampleWinService binPath="C:\MyServices\MyWinService\MyWinService.exe --windows-service" start=auto

说明:

  • MySampleWinService 是服务名称
  • binPath 指向可执行文件,并传递 --windows-service 参数用于识别运行模式
  • start=auto 表示开机自启

启动服务:

sc start MySampleWinService

查看服务状态:

sc query MySampleWinService

卸载服务(如需):

sc delete MySampleWinService

调试与日志建议

Windows 服务无法直接调试。建议:

  • 开发阶段通过控制台运行(不传 --windows-service 参数),验证逻辑
  • 使用 ILogger 记录日志,输出到文件或 Event Log
  • 部署后检查 Windows 事件查看器中的应用程序日志

若需写入 Windows 事件日志,可添加:

builder.Logging.AddEventLog();

基本上就这些。只要结构清晰,.NET 的宿主模型让 Windows 服务变得简单可控。

以上就是C# 怎么创建一个 Windows 服务_C# Windows 服务创建与部署指南的详细内容,更多请关注其它相关文章!


# 如果你  # 一分钟了解网站建设方案  # 网站推广优化该怎么做  # 南宁seo优化网络推广渠道  # 苏州商会网站建设  # 地摊经济seo优化  # 网站建设不够细致的原因  # 关键词seo排名选哪家  # seo推广还是电商运营  # 长春快速推广网站  # 网站优化师面试问题汇总  # 长时间  # 推荐使用  # 抽象类  # 是在  # c#  # 是一个  # 的是  # 如何实现  # 如何使用  # 创建一个  # elif  # .net  # nas  # microsoft  # win  # ai  # 工具  # app  # windows 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: fishbowl官网免费版 fishbowl养鱼网站入口  汽车之家官方网站官网入口_汽车之家网页版直接进入  sublime怎么设置启动时打开的窗口_sublime会话管理与热退出  Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达  mcjs网页版流畅运行 mcjs低配电脑畅玩入口  反效果?《战地6》免费试玩开启后玩家数不升反降  Lar*el Excel导入时生成自定义递增ID的策略与实践  qq游戏手机版下载安装_qq游戏移动端入口  Golang如何优雅处理error_Golang error处理最佳实践总结  QQ邮箱登录官网首页 腾讯QQ邮箱网页入口  c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析  电脑屏幕颜色不舒服怎么办_Windows夜间模式与色彩校准教程【护眼技巧】  Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧  AI泡沫首次被“刺破”:GPU十年都无法存活!  Go Martini框架:动态服务解码后的图片内容  J*a递归快速排序中静态变量的状态管理与陷阱  黑猫投诉统一入口官网 消费者权益保护投诉平台  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配  在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明  Bing引擎入口最新2025 Bing搜索免费官方登录  UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS  怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】  蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接  CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色  Lar*el DB::listen 事件中的查询执行时间单位解析  sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置  CSS布局中意外空白:解决padding-top导致的顶部间距问题  html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】  vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法  《燕云十六声》两周内达九百万玩家!位居畅销榜第五  蛙漫漫画免费阅读入口_蛙漫官方正版无广告纯净版  如何有效阻止外部脚本意外修改内联样式的高度属性  c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学  c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解  J*a TimerTask文件监控:HashMap状态管理与常见陷阱规避指南  如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】  J*aScript类型检查_j*ascript代码规范  HTML长属性值处理:表单action路径优化与代码规范应对  Excel中VLOOKUP的第四个参数是干什么用的_Excel VLOOKUP第四参数作用解析  Python实现多节点属性重叠度分析教程  随机参数递归函数的基准调用次数与时间复杂度探究  QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问  《北京人工智能产业白皮书(2025)》发布:全年核心产值预计突破 4500 亿元  J*aScript中正确使用querySelectorAll与复杂CSS选择器  树莓派传感器触发:通过Twilio API发送WhatsApp消息教程  如何在Promise链中优雅地中断后续then执行  字由网在线版登录地址 字由网网页版安全入口  1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】  在Pyomo中实现基于变量的条件约束:Big-M方法详解 

搜索