zoukankan      html  css  js  c++  java
  • C# Windows服务创建安装卸载

    一、创建Windows服务

     使用VS创建一个新的windows服务应用程序

     创建完成之后

    二、相关配置

    修改Service1名称为StartService(可以不改,自行选择

    添加安装程序并修改配置

     安装完成之后,源码中会出现一个ProjectInstaller程序集,双击进入页面修改相关属性

                   

        

     添加文件夹和实体类


     LogHelper.cs 

     1 using System;
     2 using System.Collections.Generic;
     3 using System.IO;
     4 using System.Linq;
     5 using System.Reflection;
     6 using System.Text;
     7 using System.Threading.Tasks;
     8 
     9 namespace WindowsService.Common
    10 {
    11     public class LogHelper
    12     {
    13         /// <summary>
    14         /// 获取程序异常信息
    15         /// </summary>
    16         /// <param name="methodBase"></param>
    17         /// <param name="exception"></param>
    18         /// <param name="message"></param>
    19         /// <returns></returns>
    20         public static string GetExceptionMessage(MethodBase methodBase, Exception exception, string message)
    21         {
    22             string fullName = methodBase.ReflectedType.FullName;
    23             string name = methodBase.Name;
    24             string str = $"
    异常综合信息(类:{fullName};函数名称:{name};):
    ";
    25             str += "-----------
    ";
    26             str += ".Net异常信息:
    ";
    27             if (exception == null)
    28             {
    29                 str += "   无异常对象,也无堆栈信息(exception == null)
    ";
    30             }
    31             else
    32             {
    33                 str += $"   {exception.Message}
    ";
    34                 str += $".Net堆栈信息:
    {exception.StackTrace}
    ";
    35             }
    36             str += "-----------
    ";
    37             if (message != null && message.Trim().Length > 0)
    38             {
    39                 str += "===========
    ";
    40                 str += $"自定义信息:
       {message}
    ";
    41                 str += "===========
    ";
    42             }
    43             return str;
    44         }
    45 
    46         /// <summary>
    47         /// 写出日志信息 目录地址:string logPath = AppDomain.CurrentDomain.BaseDirectory + "00_Log\";
    48         /// </summary>
    49         /// <param name="folderName"></param>
    50         /// <param name="message"></param>
    51         public static void Write(string folderName, string message)
    52         {
    53             string text = AppDomain.CurrentDomain.BaseDirectory + "00_Log\";
    54             if (folderName != null && folderName.Trim().Length > 0)
    55             {
    56                 text += folderName;
    57             }
    58             WritingLogs(text, message);
    59         }
    60 
    61         /// <summary>
    62         ///  写出异常日志(.txt)
    63         /// </summary>
    64         /// <param name="strPath"></param>
    65         /// <param name="strContent"></param>
    66         public static void WritingLogs(string strPath, string strContent)
    67         {
    68             FileStream fileStream = null;
    69             StreamWriter streamWriter = null;
    70             try
    71             {
    72                 if (!Directory.Exists(strPath))
    73                 {
    74                     Directory.CreateDirectory(strPath);
    75                 }
    76                 strPath = string.Format("{0}\{1}{2}", strPath, DateTime.Now.ToString("yyyy-MM-dd"), ".txt");
    77                 fileStream = new FileStream(strPath, FileMode.OpenOrCreate, FileAccess.Write);
    78                 streamWriter = new StreamWriter(fileStream);
    79                 streamWriter.BaseStream.Seek(0L, SeekOrigin.End);
    80                 streamWriter.WriteLine(strContent + "
    
    --------------------------------------------------------" + DateTime.Now.ToString() + "--------------------------------------------------------
    ");
    81                 streamWriter.Flush();
    82                 streamWriter.Close();
    83                 fileStream.Close();
    84             }
    85             finally
    86             {
    87                 streamWriter.Close();
    88                 fileStream.Close();
    89             }
    90         }
    91 
    92 
    93     }
    94 }
    LogHelper

     Utility.cs 

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace WindowsService.Common
     8 {
     9     public class Utility
    10     {
    11         /// <summary>
    12         /// 是否到时间进行执行
    13         /// </summary>
    14         /// <param name="hour">当前时间(小时)</param>
    15         /// <returns>true:时间已到;false:时间未到;</returns>
    16         public static bool TimeOut(string hour)
    17         {
    18             string times = "14|20|01";
    19             if (times == null || times.Trim().Length <= 0)
    20             {
    21                 return false;
    22             }
    23             if (times.IndexOf('|') > 0)
    24             {
    25                 foreach (string t in times.Split('|'))
    26                 {
    27                     if (t == hour)
    28                     {
    29                         return true;
    30                     }
    31                 }
    32             }
    33             else if (times == hour)
    34             {
    35                 return true;
    36             }
    37             return false;
    38         }
    39     }
    40 }
    Utility 

    TaskStart.cs

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Reflection;
     5 using System.ServiceProcess;
     6 using System.Text;
     7 using System.Threading;
     8 using System.Threading.Tasks;
     9 using WindowsService.Common;
    10 
    11 namespace WindowsService.BusinessServices
    12 {
    13     public class TaskStart
    14     {
    15 
    16         /// <summary>
    17         /// 业务开始运行
    18         /// </summary>
    19         public void TaskProcessing()
    20         {
    21             LogHelper.Write("Start", ".....服务正式运行.....");
    22             Thread.Sleep(1000 * 20 * 1); //在20秒内进行附加进程
    23             try
    24             {
    25                 bool isRun = false; //默认不执行
    26                 while (true)
    27                 {
    28                     string hour = DateTime.Now.ToString("HH"); //获得当前的时间
    29                     isRun = Utility.TimeOut(hour) ? true : false;
    30                     if (isRun)//判断服务是否运行
    31                     {
    32                         #region 具体业务
    33 
    34                         LogHelper.Write("具体业务", LogHelper.GetExceptionMessage(MethodBase.GetCurrentMethod(), null, Guid.NewGuid().ToString()));
    35 
    36                         #endregion
    37 
    38 
    39                         isRun = false; //已经操作一次
    40                         Thread.Sleep(1000 * 60 * 62);   //休眠 62 分钟  //必须要超过 一个 小时  
    41                     }
    42                     else
    43                     {
    44                         //睡眠两分钟
    45                         Thread.Sleep(1000 * 60 * 2);  //停止设定时间,精确度比Sleep高
    46                     }
    47                 }
    48             }
    49             catch (Exception ce)
    50             {
    51                 LogHelper.Write("Operation", LogHelper.GetExceptionMessage(MethodBase.GetCurrentMethod(), ce, "
    
    .....服务异常.....
    
    "));
    52 
    53                 ServiceController service = new ServiceController(new StartService().ServiceName);
    54                 service.Stop(); //停止服务
    55                 //service.Pause();//暂停服务
    56                 //service.Start();//开始服务
    57             }
    58         }
    59     }
    60 }
    TaskStart(具体业务)

     修改启动服务代码

     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.Reflection;
     8 using System.ServiceProcess;
     9 using System.Text;
    10 using System.Threading;
    11 using System.Threading.Tasks;
    12 using WindowsService.BusinessServices;
    13 using WindowsService.Common;
    14 
    15 namespace WindowsService
    16 {
    17     public partial class StartService : ServiceBase
    18     {
    19         /// <summary>
    20         /// 当前服务是否停止(默认时flase)
    21         /// </summary>
    22         private bool isStop = false;
    23 
    24         /// <summary>
    25         /// 启动服务
    26         /// </summary>
    27         public StartService()
    28         {
    29             InitializeComponent();
    30 
    31             this.CanPauseAndContinue = true;
    32             this.CanStop = true;
    33             isStop = false;
    34         }
    35 
    36         ///<summary>
    37         ///暂停服务
    38         ///</summary>
    39         protected override void OnPause()
    40         {
    41             LogHelper.Write("Operation", LogHelper.GetExceptionMessage(MethodBase.GetCurrentMethod(), null, "
    
    .....暂停服务.....
    
    "));
    42             isStop = true;  //服务暂停
    43         }
    44 
    45         ///<summary>
    46         ///恢复服务
    47         ///</summary>
    48         protected override void OnContinue()
    49         {
    50             LogHelper.Write("Operation", LogHelper.GetExceptionMessage(MethodBase.GetCurrentMethod(), null, "
    
    .....继续服务.....
    
    "));
    51             isStop = false; //继续服务
    52         }
    53 
    54         /// <summary>
    55         /// 服务停止
    56         /// </summary>
    57         protected override void OnStop()
    58         {
    59             LogHelper.Write("Operation", LogHelper.GetExceptionMessage(MethodBase.GetCurrentMethod(), null, "
    
    .....停止服务.....
    
    "));
    60             isStop = true;  //服务停止
    61         }
    62 
    63         /// <summary>
    64         /// 服务开始运行
    65         /// </summary>
    66         /// <param name="args"></param>
    67         protected override void OnStart(string[] args)
    68         {
    69             try
    70             {
    71                 //当服务没有停止时,开始具体业务
    72                 if (isStop == false)
    73                 {
    74                     Thread thread = new Thread(new ThreadStart(new TaskStart().TaskProcessing));
    75                     thread.Start();
    76                 }
    77             }
    78             catch (Exception ce)
    79             {
    80                 LogHelper.Write("Error", LogHelper.GetExceptionMessage(MethodBase.GetCurrentMethod(), ce, "
    
    .....停止服务.....
    
    "));
    81             }
    82         }
    83     }
    84 }
    StartService

     

     三、服务安装

    新建一个txt文本,输入以下内容,这里的WindowsService.exe 是程序路径,前面的路径是固定的,后面可变。修改txt文件名称为bat批处理文件,新建文本文档.txt——install.bat 。 然后右击 以管理员身份运行   这个批处理文件。这样服务就安装成功了。最后别忘记手动启动下这个服务。

    C:WINDOWSMicrosoft.NETFrameworkv4.0.30319InstallUtil.exe  F:DownLoadWindowsServiceWindowsServiceWindowsServiceinDebugWindowsService.exe
    pause

     

     

     

    、服务卸载

     和服务安装步骤一样,输入以下内容。然后 以管理员身份运行 即可。

    C:WINDOWSMicrosoft.NETFrameworkv4.0.30319InstallUtil.exe /u F:DownLoadWindowsServiceWindowsServiceWindowsServiceinDebugWindowsService.exe
    pause

    四、调试

    源码地址:https://github.com/RainFate/WindowsServiceDemo/tree/master/WindowsService

  • 相关阅读:
    day 34
    day 33 线程锁
    day 32 操作系统、线程和进程(GIL锁)
    day 31 网络基础的补充
    day 30 多线程 socketserver模块补充
    python自学笔记 2019/07/01
    类与对象的概念
    递归及三种二分法
    好看的颜色
    zend 汉化
  • 原文地址:https://www.cnblogs.com/RainFate/p/11791820.html
Copyright © 2011-2022 走看看