C#创建windows服务并发布

时间:2021-10-18 04:31:47

创建window 服务

新建一个window 服务项目MyService,如下图

C#创建windows服务并发布

切换到代码视图修改.

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Diagnostics;
  6. using System.IO;
  7. using System.Linq;
  8. using System.ServiceProcess;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. namespace MyService
  12. {
  13. public partial class Service1 : ServiceBase
  14. {
  15. //定时器
  16. System.Timers.Timer t = null;
  17. public Service1()
  18. {
  19. InitializeComponent();
  20. //启用暂停恢复
  21. base.CanPauseAndContinue = true;
  22. //每5秒执行一次
  23. t = new System.Timers.Timer(5000);
  24. //设置是执行一次(false)还是一直执行(true);
  25. t.AutoReset = true;
  26. //是否执行System.Timers.Timer.Elapsed事件;
  27. t.Enabled = true;
  28. //到达时间的时候执行事件(theout方法);
  29. t.Elapsed += new System.Timers.ElapsedEventHandler(theout);
  30. }
  31. //启动服务执行
  32. protected override void OnStart(string[] args)
  33. {
  34. string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "启动";
  35. WriteLog(state);
  36. }
  37. //停止服务执行
  38. protected override void OnStop()
  39. {
  40. string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "停止";
  41. WriteLog(state);
  42. }
  43. //恢复服务执行
  44. protected override void OnContinue()
  45. {
  46. string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "继续";
  47. WriteLog(state);
  48. t.Start();
  49. }
  50. //暂停服务执行
  51. protected override void OnPause()
  52. {
  53. string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "暂停";
  54. WriteLog(state);
  55. t.Stop();
  56. }
  57. public void WriteLog(string str)
  58. {
  59. using (StreamWriter sw = File.AppendText(@"d:\service.txt"))
  60. {
  61. sw.WriteLine(str);
  62. sw.Flush();
  63. }
  64. }
  65. public void theout(object source, System.Timers.ElapsedEventArgs e)
  66. {
  67. WriteLog("theout:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
  68. }
  69. }
  70. }

解释:OnStart和OnStop分别是服务器启动和停止后,所发生的事件操作方法.定义了一个定时器,每隔5秒执行一次(theout方法),因为暂停恢复功能默认是不启用的,需要设置CanPauseAndContinue属性启用此功能,同时重写OnStop和OnContinue方法,添加自己的逻辑代码.

将服务程序service1.cs 切换到视图模式,用鼠标右键单击设计视图选择“添加安装程序”选项,此后在项目中自动增加了一个ProjectInstaller.cs,

如下图

C#创建windows服务并发布

打开ProjectInstaller,修改serviceInstaller1组件属性

Description= 我的服务备注                       服务备注说明

DisplayName=我的服务                            服务友好名字

ServiceName=MyService                         安装服务器名字

StartType=Automatic                                服务类型

ü         Manual      服务安装后,必须手动启动。

ü         Automatic    每次计算机重新启动时,服务都会自动启动。

ü         Disabled     服务无法启动。

并设计serviceProcessInstaller1的属性Account=LocalSystem

运行编译,一个简单的windows服务已经开发完成.

安装window服务

安装命令:InstallUtil.exe MyServiceLog.exe

InstallUtil存在路径为:C:\WINDOWS\Microsoft.NET\Framework\.NET版本号

复制C:\WINDOWS\Microsoft.NET\Framework\版本号  路径中的InstallUtil.exe 到bin/debug或bin/release文件夹中,在命令行窗口中直接运行命令

InstallUtil.exe MyServiceLog.exe,在系统中注册这个服务,使它建立一个合适的注册项,如下图:

C#创建windows服务并发布

然后再window服务列表中,启动MyServiceLog服务

卸载window 服务

命令:InstallUtil.exe MyServiceLog.exe /u

如果修改这个服务,但是路径没有变化的话是不需要重新注册服务的,直接停止服务,然后用新的文件覆盖原来的文件即可,如果路径发生变化,应该先卸载这个服务,然后重新安装这个服务。