Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 344|回复: 0

[默认分类] C#创建Windows Service(Windows 服务)基础教程

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-7-13 12:34:56 | 显示全部楼层 |阅读模式
    Windows Service这一块并不复杂,但是注意事项太多了,网上资料也很凌乱,偶尔自己写也会丢三落四的。所以本文也就产生了,本文不会写复杂的东西,完全以基础应用的需求来写,所以不会对Windows Service写很深入。
    本文介绍了如何用C#创建、安装、启动、监控、卸载简单的Windows Service 的内容步骤和注意事项。
    一、创建一个Windows Service
    1)创建Windows Service项目

    2)对Service重命名
    将Service1重命名为你服务名称,这里我们命名为ServiceTest。
    二、创建服务安装程序
    1)添加安装程序


    之后我们可以看到上图,自动为我们创建了ProjectInstaller.cs以及2个安装的组件。
    2)修改安装服务名
    右键serviceInsraller1,选择属性,将ServiceName的值改为ServiceTest。

    3)修改安装权限
    右键serviceProcessInsraller1,选择属性,将Account的值改为LocalSystem。

    三、写入服务代码
    1)打开ServiceTest代码
    右键ServiceTest,选择查看代码。
    2)写入Service逻辑
    添加如下代码:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Diagnostics;
    6. using System.Linq;
    7. using System.ServiceProcess;
    8. using System.Text;
    9. namespace WindowsServiceTest
    10. {
    11.         public partial class ServiceTest : ServiceBase
    12.         {
    13.                 public ServiceTest()
    14.                 {
    15.                         InitializeComponent();
    16.                 }
    17.                 protected override void OnStart(string[] args)
    18.                 {
    19.                         using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\log.txt", true))
    20.                         {
    21.                                 sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Start.");
    22.                         }
    23.                 }
    24.                 protected override void OnStop()
    25.                 {
    26.                         using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\log.txt", true))
    27.                         {
    28.                                 sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Stop.");
    29.                         }
    30.                 }
    31.         }
    32. }
    复制代码
    这里我们的逻辑很简单,启动服务的时候写个日志,关闭的时候再写个日志。
    四、创建安装脚本
    在项目中添加2个文件如下(必须是ANSI或者UTF-8无BOM格式):
    1)安装脚本Install.bat
    1. %SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe WindowsServiceTest.exe
    2. Net Start ServiceTest
    3. sc config ServiceTest start= auto
    复制代码
    2)卸载脚本Uninstall.bat
    1. %SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u WindowsServiceTest.exe
    复制代码
    3)安装脚本说明
    第二行为启动服务。
    第三行为设置服务为自动运行。
    这2行视服务形式自行选择。
    4)脚本调试
    如果需要查看脚本运行状况,在脚本最后一行加入pause
    五、在C#中对服务进行控制
    0)配置目录结构
    简历一个新WPF项目,叫WindowsServiceTestUI,添加对System.ServiceProcess的引用。
    在WindowsServiceTestUI的bin\Debug目录下建立Service目录。
    将WindowsServiceTest的生成目录设置为上面创建的Service目录。
    生成后目录结构如下图


    1)安装
    安装时会产生目录问题,所以安装代码如下:
    1. string CurrentDirectory = System.Environment.CurrentDirectory;
    2. System.Environment.CurrentDirectory = CurrentDirectory + "\\Service";
    3. Process process = new Process();
    4. process.StartInfo.UseShellExecute = false;
    5. process.StartInfo.FileName = "Install.bat";
    6. process.StartInfo.CreateNoWindow = true;
    7. process.Start();
    8. System.Environment.CurrentDirectory = CurrentDirectory;
    复制代码
    2)卸载
    卸载时也会产生目录问题,所以卸载代码如下:
    1. string CurrentDirectory = System.Environment.CurrentDirectory;
    2. System.Environment.CurrentDirectory = CurrentDirectory + "\\Service";
    3. Process process = new Process();
    4. process.StartInfo.UseShellExecute = false;
    5. process.StartInfo.FileName = "Uninstall.bat";
    6. process.StartInfo.CreateNoWindow = true;
    7. process.Start();
    8. System.Environment.CurrentDirectory = CurrentDirectory;
    复制代码
    3)启动
    代码如下:
    1. using System.ServiceProcess;
    2. ServiceController serviceController = new ServiceController("ServiceTest");
    3. serviceController.Start();
    复制代码
    4)停止
    1. ServiceController serviceController = new ServiceController("ServiceTest");
    2. if (serviceController.CanStop)
    3.         serviceController.Stop();
    复制代码
    5)暂停/继续
    1. ServiceController serviceController = new ServiceController("ServiceTest");
    2. if (serviceController.CanPauseAndContinue)
    3. {
    4.         if (serviceController.Status == ServiceControllerStatus.Running)
    5.                 serviceController.Pause();
    6.         else if (serviceController.Status == ServiceControllerStatus.Paused)
    7.                 serviceController.Continue();
    8. }
    复制代码
    6)检查状态
    1. ServiceController serviceController = new ServiceController("ServiceTest");
    2. string Status = serviceController.Status.ToString();
    复制代码
    六、调试Windows Service
    1)安装并运行服务
    2)附加进程

    3)在代码中加入断点进行调试

    七、总结
    本文对Windows service的上述配置都未做详细解释,但是按上述步骤就可以制作可运行的Windows Service,从而达到了工作的需求。
    示例代码请见:https://github.com/sorex/WindowsServiceTest
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-19 11:13 , Processed in 0.417033 second(s), 37 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表