C# Windows服务创建安装卸载
标签:for 正式 height directory cte main 新建 get 图片
一、创建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 ///
14 /// 获取程序异常信息
15 ///
16 ///
17 ///
18 ///
19 ///
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 = $"\r\n异常综合信息(类:{fullName};函数名称:{name};):\r\n";
25 str += "-----------\r\n";
26 str += ".Net异常信息:\r\n";
27 if (exception == null)
28 {
29 str += " 无异常对象,也无堆栈信息(exception == null)\r\n";
30 }
31 else
32 {
33 str += $" {exception.Message}\r\n";
34 str += $".Net堆栈信息:\r\n{exception.StackTrace}\r\n";
35 }
36 str += "-----------\r\n";
37 if (message != null && message.Trim().Length > 0)
38 {
39 str += "===========\r\n";
40 str += $"自定义信息:\r\n {message}\r\n";
41 str += "===========\r\n";
42 }
43 return str;
44 }
45
46 ///
47 /// 写出日志信息 目录地址:string logPath = AppDomain.CurrentDomain.BaseDirectory + "00_Log\\";
48 ///
49 ///
50 ///
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 ///
62 /// 写出异常日志(.txt)
63 ///
64 ///
65 ///
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 + "\r\n\r\n--------------------------------------------------------" + DateTime.Now.ToString() + "--------------------------------------------------------\r\n");
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 ///
12 /// 是否到时间进行执行
13 ///
14 /// 当前时间(小时)
15 /// true:时间已到;false:时间未到;
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 ///
17 /// 业务开始运行
18 ///
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, "\r\n\r\n.....服务异常.....\r\n\r\n"));
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 ///
20 /// 当前服务是否停止(默认时flase)
21 ///
22 private bool isStop = false;
23
24 ///
25 /// 启动服务
26 ///
27 public StartService()
28 {
29 InitializeComponent();
30
31 this.CanPauseAndContinue = true;
32 this.CanStop = true;
33 isStop = false;
34 }
35
36 ///
37 ///暂停服务
38 ///
39 protected override void OnPause()
40 {
41 LogHelper.Write("Operation", LogHelper.GetExceptionMessage(MethodBase.GetCurrentMethod(), null, "\r\n\r\n.....暂停服务.....\r\n\r\n"));
42 isStop = true; //服务暂停
43 }
44
45 ///
46 ///恢复服务
47 ///
48 protected override void OnContinue()
49 {
50 LogHelper.Write("Operation", LogHelper.GetExceptionMessage(MethodBase.GetCurrentMethod(), null, "\r\n\r\n.....继续服务.....\r\n\r\n"));
51 isStop = false; //继续服务
52 }
53
54 ///
55 /// 服务停止
56 ///
57 protected override void OnStop()
58 {
59 LogHelper.Write("Operation", LogHelper.GetExceptionMessage(MethodBase.GetCurrentMethod(), null, "\r\n\r\n.....停止服务.....\r\n\r\n"));
60 isStop = true; //服务停止
61 }
62
63 ///
64 /// 服务开始运行
65 ///
66 ///
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, "\r\n\r\n.....停止服务.....\r\n\r\n"));
81 }
82 }
83 }
84 }
StartService
三、服务安装
新建一个txt文本,输入以下内容,这里的WindowsService.exe 是程序路径,前面的路径是固定的,后面可变。修改txt文件名称为bat批处理文件,新建文本文档.txt——install.bat 。 然后右击 以管理员身份运行 这个批处理文件。这样服务就安装成功了。最后别忘记手动启动下这个服务。
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe F:\DownLoad\WindowsService\WindowsService\WindowsService\bin\Debug\WindowsService.exe
pause
三、服务卸载
和服务安装步骤一样,输入以下内容。然后 以管理员身份运行 即可。
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /u F:\DownLoad\WindowsService\WindowsService\WindowsService\bin\Debug\WindowsService.exe
pause
四、调试
源码地址:https://github.com/RainFate/WindowsServiceDemo
C# Windows服务创建安装卸载
标签:for 正式 height directory cte main 新建 get 图片
原文地址:https://www.cnblogs.com/RainFate/p/11791820.html
评论