创建第一个windows服务

windows服务应用程序是一种长期运行在操作系统后台的程序,它对于服务器环境特别适合,它没有用户界面,不会产生任何可视输出,任何用户输出都回被写进windows事件日志。

计算机启动时,服务会自动开始运行,他们不要用户一定登陆才运行。

可以通过选择菜单“开始”-〉“控制面板”-〉“管理工具”-〉“服务”来查看现有系统中的服务,如下图:

创建一个windows服务

切换到代码视图修改.

using System;
using System.IO;
using System.ServiceProcess;

namespace WindowsServiceTest
{
    public partial class hjpServiceTest : ServiceBase
    {
        //定时器
        System.Timers.Timer t = null;

        public hjpServiceTest()
        {
            InitializeComponent();  

            //启用暂停恢复
            base.CanPauseAndContinue = true;  

            //每5秒执行一次
            t = new System.Timers.Timer(5000);
            //设置是执行一次(false)还是一直执行(true);
            t.AutoReset = true;
            //是否执行System.Timers.Timer.Elapsed事件;
            t.Enabled = true;
            //到达时间的时候执行事件(theout方法);
            t.Elapsed += new System.Timers.ElapsedEventHandler(theout);
        }  

        //启动服务执行
        protected override void OnStart(string[] args)
        {
            string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "启动";
            WriteLog(state);
        }  

        //停止服务执行
        protected override void OnStop()
        {
            string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "停止";
            WriteLog(state);
        }  

        //恢复服务执行
        protected override void OnContinue()
        {
            string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "继续";
            WriteLog(state);
            t.Start();
        }  

        //暂停服务执行
        protected override void OnPause()
        {
            string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "暂停";
            WriteLog(state);
            t.Stop();
        }  

        public void WriteLog(string str)
        {
            using (StreamWriter sw = File.AppendText(@"d:\service.txt"))
            {
                sw.WriteLine(str);
                sw.Flush();
            }
        }  

        public void theout(object source, System.Timers.ElapsedEventArgs e)
        {
            WriteLog("theout:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
        }
    }
}

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

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

如下图

打开ProjectInstaller,修改serviceInstaller1组件属性

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

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

ServiceName=hjpServiceTest                         安装服务器名字

StartType=Automatic                                服务类型

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

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

ü         Disabled     服务无法启动。

并设计serviceProcessInstaller1的属性Account=LocalSystem

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

安装window服务

安装命令:InstallUtil.exe WindowsServiceTest.exe

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

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

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

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

卸载window 服务

命令:InstallUtil.exe WindowsServiceTest.exe /u

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

------------------------------------------------------------------------------------------------------

Window服务应用程序体系结构

.net framework对windows服务提供了更多的支持,在命名空间System.ServiceProcess下.

包括类如下:

ServiceBase 所有Window服务的基类

ServiceController 该类的一个实例代表一个具体的windows服务

ServiceControllerPermission 用于控制ServiceController的使用权限

ServiceInstaller 用于执行对windows服务的安装

ServiceProcessInstaller 用于执行对windows服务的安装,与上类的不同的是,该类可以代表一个可以执行的windows服务的进程.

ServiceBase类

ServiceBase方法:


方法


描述


Run()


运行一个windows服务


OnContinue()


继续执行服务


OnCustomCommand()


向windows服务发出自定指令


OnPause()


暂停正在运行的windows服务


OnPowerEvent()


当计算机的电源状态改变是调用


OnShutDown()


当系统关闭条用OnStart()开始一个windows服务


OnStop()


结束一个windows服务

ServiceBase属性:


属性


描述


AutoLog


表示是否将开始,结束,暂停,继续等指令写入事件日志


CanHandlePowerEvent


表示该服务是否支持电源事件


CanPauseAndContinue


表示该服务是否支持暂停和继续功能


CanShutDown


表示该服务是否支持关闭功能


CanStop


表示该服务是否支持结构功能


EventLog


应用程序的时间日志


ServiceName


该服务名称

ServiceController类

服务控制类,用于控制windows服务的各种具体行为,它既可以控制本地的windows服务,有可以控制远程的windows服务。

ServiceControler的方法:


方法


描述


GetDivices()


得到一台计算机上设备驱动器服务


GetServices()


得到一台计算上的非设备驱动器服务


Close()


用于断开服务连接,并且释放服务控制器所占用的资源


Continue()


继续被暂停的服务


ExcuteCommand()


对服务执行一条自定义命令


Pause()


暂停服务


Refresh()


对所有属性更新


Start()


启动服务


Stop()


停止服务


WaitForStatus()


等待服务到达指定的状态

ServiceController属性

属性 描述
CanPauseAndContinue 表示服务是否可以停止
CanShutDown 表示服务在系统关闭时是否可以得到通知,CanStop表示服务器是否可以被停止
DependentServices 表示与服务相关联的设备
DisplayName 表示服务控制器所绑定的名称
MachineName 表示服务所在的计算机名称
ServiceName 表示绑定的服务名称
ServiceType 表示控制器所引用的服务类型
ServicesDependedOn 表示服务所依赖ude服务集合Status表示控制器所引用的服务状态

ServiceInstaller类

ServiceInstaller的属性

属性 描述
DisplayName 显示名称
ServiceName 表示服务名称,这个名称必须与Installer将要安装的windows服务名称相同
ServiceDependOn 服务所要用到的其服务名称的一个数组
StartType 表示所安装服务的启动特性,可以为Automatic,Manual或Disable,默认为Manual

ServiceInstaller事件

方法 事件
AfterInstaller() 调用Install方法后发生
AfterRollback() 调用Rollback后发生
AfterUninstall() 调用Uninstall方法后发生
BeforeInstall() 调用Install方法前发生
BeforeRollback() 调用Rollback方法前发生
BeforeUninstall() 调用Uninstall方法前发生
Committed() 调用Commit方法后发生
Committing() 调用Commit方法前发生

ServiceProcessInstaller类

用于安装ServiceBase继承的windows服务,它与一个可执行程序中的所有服务所做基本工作相同

ServiceProcessInstaller属性

属性 描述
Account 运行服务的当前用户账号
HelpText 在服务安装选项中给出的帮助信息
Password 运行服务的当前账号密码
UserName 运行服务的当前账号用户名

------------------------------------------------------------------------------------------------------------------------

Windows服务调试

vs打开MySerivceLog项目

在管理工具-〉服务里面启动MyServiceLog服务

单击vs的调试 -〉附加到进程,如下图

在"可用进程“列表中,选中你要调式的服务的可执行文件名

单击 ”附加“按钮,即可进入调试状态

在timer1_Elapsed方法里设置一个断点,然后等它执行,服务执行到该处时候会自动启动断点。

时间: 2024-10-06 15:18:02

创建第一个windows服务的相关文章

给自己的C++程序创建为一个windows service

因为项目的一些变化和原因,需要把数据处理的一个后台程序创建为一个windows服务,运行以下命令能创建成功: sc create "MyApp Service Name" binPath= "D:/MathxH/Project/SocketService/trunk/MyApp/Win32/Release/MyApp.exe" start= auto 但是因为我的App程序是非服务(non-service)可执行程序,所以在让它运行的时候,却失败了,抛出以下错误:

C#创建、安装一个Windows服务

C#创建.安装一个Windows服务http://blog.csdn.net/yysyangyangyangshan/article/details/10515035 关于WIndows服务的介绍,之前写过一篇:http://blog.csdn.net/yysyangyangyangshan/article/details/7295739.可能这里对如何写一个服务不是很详细.现在纯用代码的形式介绍一下windows服务是如何开发和安装的. 开发环境:Win7 32位:工具:visualstudi

为MongoDB创建一个Windows服务

一:选型,根据机器的操作系统类型来选择合适的版本,使用下面的命令行查询机器的操作系统版本 wmic os get osarchitecture 二:下载并安装 附上下载链接 点击安装包,我这里是把文件安装到了(E:\MongoDB) 安装好之后该文件夹下就出现下面的文件, 这个时候新建一个Data文件夹用来存放MongoDB的所有数据,新建一个Log文件夹用来存放日志文件 三:启动MongoDB数据库,在命令行窗口执行下面的命令,执行完成之后会看到下面的提示信息 e:\mongodb\bin\m

利用C#创建和安装一个windows服务

最近项目需要,需要定时获取天气资料往数据数库内写入数据,所以就考虑到了.net内的window服务.以前没有这方面的需求,所以基本没怎么接触过.所以也借这次机会好好补充下这方面的知识,以备以后工作之需. 关于winds服务的介绍,这里有一篇文章介绍得很清楚:http://blog.csdn.net/yysyangyangyangshan/article/details/7295739,但这里的具体步骤讲述不是很清楚,所以现用具体的方式再讲述下windows服务的开发与安装事项. 开发环境:Win

[翻译] 使用 .NET Core 3.0 创建一个 Windows 服务

原文: .NET Core Workers as Windows Services 在 .NET Core 3.0 中,我们引入了一种名为 Worker Service 的新型应用程序模板.此模板旨在为您在 .NET Core 中编写长时间运行的服务的提供一个起点.在本演练中,我们将创建一个 worker 并将其作为 Windows 服务运行. 创建一个 Worker 注意:在我们的预览版中,worker 模板与 Web 模板位于同一级菜单中.这将在未来的版本中发生变化.我们打算将 Worker

.net创建并安装windows服务案例

1. 创建windows服务[引用博文]: 1. 将这个服务程序切换到设计视图2. 右击设计视图选择“添加安装程序”3. 切换到刚被添加的ProjectInstaller的设计视图4. 设置serviceInstaller1组件的属性: 1) ServiceName = My Sample Service2) StartType = Automatic5. 设置serviceProcessInstaller1组件的属性 1) Account = LocalSystem6. 生成解决方案 注意:尝

SC命令创建和删除windows服务

命令格式: sc [servername] create Servicename [Optionname= Optionvalues] servername 可选,可以使用双斜线,如\\\\myserver,也可以是\\\\192.168.0.1来操作远程计算机.如果在本地计算机上操作就不用添加任何参数. Servicename 在注册表中为service key制定的名称.注意这个名称是不同于显示名称的(这个名称可以用net start和服务控制面板看到),而SC是使用服务键名来鉴别服务的.

我的第一个Windows服务

代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.IO; using System.Linq; using System.ServiceProcess; using System.Text; using System.Threading.Tasks; namespace

Python写自动化之写一个Windows 服务

Python 写windows 服务,需要使用 pywin32包. 直接上代码: #encoding=utf8 ''' Created on 2014-7-1 @author: wangmengnan ''' import os import sys import win32serviceutil import win32service import win32event class PythonService(win32serviceutil.ServiceFramework): #服务名 _