如何做个自己想要的Window的服务了?
前言说明
- 使用工具:VS2019
- 思考为什么要使用Window服务,它能做什么了?(后面解答)
一:什么是Window服务?(我们做的是一个什么东西?)
Microsoft Windows 服务(过去称为 NT 服务)允许用户创建可在其自身的 Windows 会话中长时间运行的可执行应用程序。(微软爸爸是这么解释,简单介绍)
我的理解,它就是一个挂载在我们系统上的服务,我们系统上服务其实有很多,比如我们的Sql数据库的服务:MSSQLSERVER,这个是启动数据库的一个服务,开启这个服务我们才能连接本地的安装的SQL。那WindowService应该也是一个这样的服务,可以理解是一个可以让我们自定义开发的服务。
二:如何创建WindowService?(我们知道是什么东西,怎么做?)
1.打开VS2019,类别选择服务,选择Windows服务类别
2.添加安装程序
安装之后,目录会添加新文件
2.1看看这两个文件
serviceInstaller1:
用的多的属性:
- DelayedAutoStart:是否自动启动
- Descrition:介绍服务(自定义)
- DisplayName:标识服务器友好名称(自定义)
serviceProcessInstaller1:
- Account:设置为LocalSystem(运行此服务的账户类型)
到此,一个服务就写好,只是他还没有任何灵魂(业务逻辑)
三:怎么编写我们的业务逻辑?(在哪里注入我们的灵魂)
3.1打开Service1类,按F7进入代码界面,如下图所示:
当前类有3个方法:
- Service1:构造函数
- OnStart:启动服务时会触发的方法(可以传递参数)
- OnStop:结束服务时会触发的方法
3.2我们在OnStart和OnStop进行日志打印,代码如下:
public Service1()
{
InitializeComponent();
eventLog1 = new System.Diagnostics.EventLog();
if (!System.Diagnostics.EventLog.SourceExists("MySource"))
{
System.Diagnostics.EventLog.CreateEventSource(
"MySource", "MyNewLog");
}
eventLog1.Source = "MySource";
eventLog1.Log = "MyNewLog";
}
protected override void OnStart(string[] args)
{
eventLog1.WriteEntry("In OnStart.");
LogHelper.loginfo.Info("In OnStart.");
}
protected override void OnStop()
{
eventLog1.WriteEntry("In OnStop.");
LogHelper.loginfo.Info("In OnStop.");
}
这里,我使用两种日志进行打印我们的日志信息
- EventLog:这个是系统自带一个控件(也是微软教程中使用的日志记录)
- log4net:这个是一个第三方库日志程序集
看看效果:
Eventlog:(日志数量有限制,超过一定的数量就不会在显示了)
log4net:(自定义,想怎么存,怎么存【推荐】)
四:编写好的服务,如何安装?(安装发动机)
4.1首先编译程序(快捷键:CtrL+Shift+B),生成项目
4.2找到目标文件
- 右键项目,选择在文件资源管理器中打开文件夹
- 找到Debug文件夹下面后缀为****.exe程序
- 赋值路径:绝对路径,类是于:[D:****.exe]
- 看看路径【C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2019\Visual Studio Tools】,找到工具:Developer Command Prompt for VS 2019允许启动
4.3 在打开的CMD【就是上面打开的Developer Command Prompt for VS 2019程序,不是我们Win+R打开的】中,输入命令:
InstallUtil.exe C:\**\test\bin\Debug\test.exe
如上图标识已经安装成功!
五:安装好,如何启动?(点火启动)
输入命令:
net start 你定义的服务的名称【二:如何创建WindowService=>2.添加安装程序=>DisplayName】
如上图表示启动成功
六:不想用了,如何停止?(关火休息)
输入命令:
net stop 你定义的服务的名称【二:如何创建WindowService=>2.添加安装程序=>DisplayName】
如上图表示关闭成功
七:不想要了,如何卸载?(拆掉发动机)
输入命令:
InstallUtil.exe /u C:\**\test\bin\Debug\test.exe
如上图表示卸载成功
1.找到 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2019\Visual Studio Tools】,找到工具:Developer Command Prompt for VS 2019 启动
2.输入InstallUtil.exe D:\**\**.exe,回车安装服务
3.输入:net start SundyService (启动服务)
4.输入:net stop SundyService (停止服务)
5.输入InstallUtil.exe /u D:\**\**.exe 卸载服务
八:参考文档
九:总结
我为什么要做这个WindwoService,是公司需要做一个运维软件,需要编写一个Windows服务,我也是看着官方文档学习的,业务逻辑比较简单, 开发也挺快的。
自己对Window服务理解,我们其实这种服务也是一个程序,只是它集成到Windows系统服务中,这样有一个好处,可以设置开机自动启动,而且还神不知鬼不觉,在客户电脑上安装,客户也不知道,我们是做运维监控,不是干坏事。可以把一些需要执行的任务,做成服务,放在服务器或自己电脑服务上,就可以自动跑,设置开机自起。
十:不足的地方
- 本文没有介绍 EventLog是怎么来:这个在工具箱中,可以找到,然后点击Service1,做进来就行了
- 服务默认是启动和停止方法,还可以扩展,有暂停,恢复,这两个方法,需要我们重写才能触发事件
- 园友提供:Topshelf有兴趣试试