创建一个Windows Service应用程序

创建、安装、调试windows service(附详细步骤) 创建、安装、调试windows service(附详细步骤) 最近项目中需要做一个定时执行某个服务的功能,刚开始想用Oracle JOB做,但是后来发现程序的主要逻辑不是写在存储过程中的,所以决定用Windows Service来做。倒腾倒腾了半天,也算是圆满成功。 先介绍一下我的开发平台,VS 2005(有点老哦,项目是升级原来的系统,所以平台也是2005)、windows 7、Oracle等等。好了话不多说,进入正题…… 阅读详情
创建一个Windows Service应用程序


下载本文代码
见资源
正是由于.NET Framework的出现,才使你能够构建出在系统重新启动时自动运行的、无人参与的(unattended)应用程序。
by Stan Schultes
技术工具箱:VB.NET, XML, ASP

Windows service应用程序曾经是C++程序员专用的领域,除非你在VB中使用了第三方工具。现在它们则成为System.ServiceProcess 命名空间下的.NET Framework类库中的主要部分,你可以随意使用任何.NET语言来构建它。Windows service是一种系统自动的、无人参与的程序(仅存在于Windows NT、2000和XP操作系统中),它能够在系统启动时开始运行。你可以通过Service Control Manager (SCM) applet或者一些特殊的service-control应用(utility)来访问Windows service。

我将讲解如何构建一个用于监控文件改变情况的Windows service。FileChangeMonitor service用于随意地编写事务日志(event-log)条目以及当文件在一段时间内没有改变时发送e-mail。这种文件监控过程在用于确保需要时进行备份、正常运转报告生成器或按时间表将文件传送到远程系统上时是非常有用的。FileChangeMonitor service还能够发送显示程序正常运行的综合报告。

第一步是构建一个作为将来service项目起始点的Windows service程序的模板。打开Visual Studio.NET,用Windows Service模板来创建一个新的项目,将其命名为FileChangeMonitor(点此下载范例代码)。鼠标右键单击Solution Explorer(SE)中的Service1.vb文件并将其重新命名为ChangeMonitor.vb。点击ChangeMonitor 设计界面(你会看到“To add components to your class”消息),并将其在属性窗口(按F4显示的窗口)中的的名字和ServiceName属性均改为ChangeMonitor。

同样将属性窗口中的CanPauseAndContinue和CanShutdown属性值设置为True。 这些属性控制着该service程序是否能够暂停/继续,以及在系统关闭时是否做出响应。你将在后面使用这些事件(以及Stop事件)来保存你的service的“状态”――即给定时间内的执行文本(execution context )。

接下来,点击ChangeMonitor 设计窗口中的“click here to switch to code view”链接。在代码窗口中,点击左边的加号来打开名为“Component Designer generated code”的区域。在Sub Main过程(routine)中,将ServicesToRun 赋值语句中的Service1改为ChangeMonitor:

ServicesToRun = New System. _
   ServiceProcess.ServiceBase() _
   {New ChangeMonitor()}

右键单击在SE中的FileChangeMonitor项目,选中属性,再从StartupObject下拉列表中选择Sub Main。现在你就可以开始构建你的项目了(通过使用Build | Build Solution菜单项)。

创建事件模板和过程
现在,在模板中加入一些事件过程(event-routine)的原型。你等一会儿可以将代码添加到这些service事件中去以便处理 Windows service程序中的状态变化。在代码窗口中点击Class Name combo box(位于代码窗口上面左侧的combo box),然后选中(Overrides)选项。在Method Name combo box中(位于代码窗口上面右侧的combo box),依次选中各项以便将过程原型(一个空程序)添加到代码窗口中,比如:OnContinue、OnPause和OnShutdown。你必须在每个过程中的Method Name combo box中重新选择(Overrides)选项 。

接下来就开始构建过程模板。在你需要添加代码的ChangeMonitor.vb中创建五个子过程原型: LoadSettings()、SaveSettings()、RunCheck()、RunSummary()和StartService()。在这个类的最顶部Imports System.ServiceProcess语句的下面,通过使用Imports语句来添加其他需要用到的命名空间:

Imports System.IO
Imports System.Timers
Imports System.Web.Mail
Imports System.Reflection
Imports System.Xml.Serialization

由于你的service应用程序不是一个Web项目,因此你可能需要手动将一个引用(reference)添加到Web.Mail命名空间下。右键单击SE中的FileChangeMonitor项目,从弹出菜单中选择Add Reference。在 Add Reference对话框中选择列表中的System.Web.dll条目,单击Select按钮,然后点OK。

在ChangeMonitor类的顶部、Component Designer区域的前面,添加一个用于文件检查功能的Timer对象的声明:

Private WithEvents ControlTimer As Timer

然后将下面三行代码加到OnStart和OnContinue事件程序中:

StartService()
RunCheck()
RunSummary()

当你的service启动时会触发OnStart事件,而当暂停后继续运行时则会触发OnContinue事件。

在Class Name combo box中选择ControlTimer,并在Method Name combo box中选择Elapsed。这样就会将ControlTimer_Elapsed事件过程原型添加到项目中了。只需添加这两个Run语句到ControlTimer_Elapsed事件过程中,然后在OnPause、OnShutdown和OnStop事件过程中添加代码来中断计时器(Timer)并保存设置:

ControlTimer.Stop()
SaveSettings()

从这个简单的程序大纲中你可以看到用于Windows service应用程序的文件检查功能的控制流程是如何运作的。当其中一个事件触发时,StartService函数便会加载设置,然后运行文件和简要检查。你可以在计时器时间到时运行检查程序;可以用stop或pause事件来中断计时器以及保存设置。

在StartService过程中添加代码来创建计时器,将时间间隔定为15秒(以毫秒值计),然后启动它:

ControlTimer = New Timer()
ControlTimer.Interval = 15000
ControlTimer.AutoReset = True
ControlTimer.Start()

AutoReset = True属性设定使计时器在时间到时继续运行。接下来,你可以在check函数运行时添加代码来编写Windows Application事务日志,这样你就可以看到service正在运行:

Private Sub RunCheck()
   EventLog.WriteEntry(ServiceName & _
      " - Check", "Checking Files.")
End Sub

你可以通过Windows中的Event Viewer(EV)应用程序来查看事件日志中的消息。

添加一个安装程序(Installer)
创建service应用程序模板的最后一项工作是在项目中添加一个安装程序。在它运行之前你需要首先注册这个Windows service程序。切换到ChangeMonitor设计界面并打开属性窗口(如果看不到的话可以按F4),你可以看到在属性窗口下面有一个名为Add Installer的链接,点击该链接后会出现一个向导来引导你将一个名为ProjectInstaller的组件添加到当前项目中。这个向导在ProjectInstaller设计界面中放置了两个service控件:ServiceProcessInstaller和ServiceInstaller。

图1.
图1. 设置Service属性
点击ServiceProcessInstaller控件并对Account属性进行设置。你可能希望选择LocalSystem(大多数service是运行在LocalSystem中的),但如果你喜欢,你还可以将它设置为一个用户帐户。点击ServiceInstaller,将它的属性设置为DisplayName = FileChangeMonitor、 ServiceName = ChangeMonitor以及StartType = Automatic(如果你希望通过手动启动该service的话也可以将它设置为Manual)。

通过Build | Build Solution来构建你自己的项目,确保不存在什么错误。现在你就可以使用一个名为InstallUtil的Framework应用来安装你的service了。打开命令行提示(command-prompt)窗口并执行corvars.bat文件来设置环境变量(你可以下载readme文件来了解详细内容)。使用cd(change directory)命令将其导航到你项目中的/bin目录下。执行以下命令来安装你的service:

> InstallUtil filechangemonitor.exe

现在你可以使用Control Panel的Administrative Tools菜单(Win2K 和WinXP操作系统)中的SCM applet来启动、停止、暂停以及继续运行你的FileChangeMonitor service了 (见图1)。当你启动这个service后就可以使用EV来查看Application事务日志中由该service生成的事件了。点击F5刷新EV的显示,你会看到“Check messages every 15 seconds”。你可以使用以下命令来卸载这个service(先用SCM来终止service):

> InstallUtil filechangemonitor.exe /u

现在你可以保存该项目并将它作为以后service程序的一个模板。

Service以某种状态运行(这可能是它未运行时保存的一组设定)。当service重新启动时,你可以加载它上次运行时的状态。一个简便的方法是使用.NET Framework中的序列化类(serialization class),如System.Xml.Serialization命名空间下的XML序列化(你也可以选择binary和SOAP序列化)。

用XML序列化保存设置
XML序列化是和用<Serializable()>属性标记的类配合使用的。右键单击SE中的FileChangeMonitor项目,从弹出的菜单中选择Add | Add Class,将该类命名为CMonitor并点击 OK。在CMonitor中添加两个类――MonitorHeader和MonitorFile:

<Serializable()> Public Class MonitorHeader
   Public MonitorIntSecs As Integer
   '<other header properties>
   Public Files() As MonitorFile
End Class
<Serializable()> Public Class MonitorFile
   Public Path As String
   '<other file properties>
End Class

MonitorHeader包含控制service的设置,包括一组MonitorFile对象。MonitorFile对象中包含每个你想要检查进度的文件的监控设置。你可以将大多数类的属性当作Public变量来实现,因为它们只用于你的service项目中。查看范例代码来了解该类的完整定义。你可以在ChangeMonitor 类的模块中实现LoadSettings和SaveSettings序列化过程(见列表1)。

在用于声明设置对象和存储设置文件路径的ChangeMonitor类的顶部添加该类的私有变量:

Private m_MonitorControl As New _
   MonitorHeader()
Private m_sSettingsPath As String 

在调用StartService()之前将代码添加到OnStart过程中,来完成在service启动之前对设置文件名进行检测。用Reflection来找到应用程序的runtime .exe路径,并用substitute .xml作为文件的扩展名(这两个文件在同一目录下):

m_sSettingsPath = [Assembly]. _
   GetEntryAssembly.Location. _
   Replace(".exe", ".xml")

在VB.NET中assembly是一个关键字,因此在代码中你必须把它用一个方括号括起来。你需要整理StartService()过程以便从设置文件中加载计时器间隔:

If m_MonitorControl _
   .MonitorIntervalSecs > 0 Then
   ControlTimer.Interval = _
      Ctype(m_MonitorControl _
      .MonitorIntervalSecs * 1000, Double)
   ControlTimer.AutoReset = True
   ControlTimer.Start()
End If

现在,你可以实现主要的检查函数――RunCheck了(见列表2)。RunCheck负责调用RunAlarmAction并计算出Files数组中每个文件的出现次数,该文件的NextCheck代表的是当前时间之前的时间并且自从上次检查以后就没有发生过改变。RunAlarmAction负责检查AlarmAction标记、编写事务日志,然后通过SendEmail过程来发送e-mail (见列表3)。

你可以采用类似的方法,基于MonitorHeader结构的汇总设置(summary setting)来实现RunSummary和RunSummaryAction方法,构建并测试你的Windows service应用程序。范例代码中还包括一个名为FileChgCtl的service-control应用。它主要用于调试目的,可以将自定义命令(custom command)发送到FileChangeMonitor service中。自定义命令是一个范围在128到255之间的整数。当Windows service应用程序中的OnCustomCommand事件触发时你会得到自定义命令出现的通知。

你会发现service 应用程序在很多情况下是非常有用的,比如用在系统维护、监控以及其他自动的、无人照顾的操作中。Windows service通常会通过事务日志来记录其活动情况,但正如我所介绍的,你的service也可以通过发送e-mail来方便地跟踪其进展情况。构建Windows service应用程序的能力使你在用Windows构建有效的商务方案方面得以轻松地扩展。


关于作者:
Stan Schultes 是Florida州Sarasota地区的一名Web和企业应用程序的架构师和开发人员,以及VB开发领域的MCP。Stan是VSM的一名特约编辑,定期为该杂志撰写文章。你可以访问Stan的网站 www.vbnetexpert.com查看在线代码演示、更新资料以及其他信息。他的e-mail地址是 stan@vbnetexpert.com。
用VB.net编写的Windows服务管理程序(堪称经典)全部源代码 用VB.net编写的Windows服务管理程序(堪称经典)全部源代码,提供了全部的服务功能,绝对值得下载 立即下载

相关推荐

ArcGIS Enterprise10.9.1的Windows安装部署

ArcGIS Enterprise10.9.1中Windows版本安装介绍。

qq_36250702的博客 2446

Verilog实现74HC194双向移位寄存器的FPGA应用实战

本文详细介绍了使用Verilog实现74HC194双向移位寄存器的FPGA应用实战,包括基础解析、关键设计要点、仿真验证、典型问题排查及性能优化技巧。通过实际案例展示其在串并转换和环形计数器中的应用,帮助开发者高效完成数字电路设计。

w8x9y0z1的博客 681

全球尺度遥感云计算平台:Google Earth Engine

Google Earth Engine(GEE)是一个基于 Google 云服务基础设施的遥感大数据分析平台,它结合 Google 强大的云计算能力与 NASA、ESA、NOAA 等机构的空间数据,用于在全球尺度解决一些非常重要的社会问题:森林退化、粮食安全、灾害预警、水资源管理、气候监测以及环境保护等。 GEE 官方宣传视频(版权归 Google 所有) Spacefan 的视频 ·303播放 发展背景 2008 年,手握 40 多年 LandSat 数据的美国地质调查局(USG...

qq_41240287的博客 5015

管理 Windows 自定义服务(Windows Service)

管理 Windows 自定义服务(Windows Service)

前端开发 2112

RTPS规范v2.3(中文版)

DDSI-RTPSv2.3,DDS发现互操作性-实时发布订阅通信协议,中文版

pony12的专栏 752

如何让Arduino IDE支持你手里的STM32 nucleo开发板

Arduino IDE开发环境在默认情况下不支持STM32 NUCLEO开发板,只有通过添加附加开发板管理包才能使用。目前为止,只有一部分板子支持使用Arduino IDE开发环境进行开发,分别是 Nucleo F207ZG, Nucleo F429ZI, Nucleo F030R8, Nucleo F091RC, Nucleo F103RB, Nucleo F303RE, Nucl...

mzw72188552的专栏 8972

php 编写windows服务,C#编写Windows服务程序的图文详解

本文介绍了如何用C#创建、安装、启动、监控、卸载简单的Windows Service 的内容步骤和注意事项,需要的朋友可以参考下一、创建一个Windows Service1)创建Windows Service项目2)对Service重命名将Service1重命名为你服务名称,这里我们命名为ServiceTest。二、创建服务安装程序1)添加安装程序之后我们可以看到上图,自动为我们创建了Projec...

weixin_34307029的博客 291

squidpy 教程 2:利用 Scanpy 和 Squidpy 进行空间数据的可视化分析

本教程详细介绍了如何利用Squidpy和Scanpy对空间转录组数据进行可视化分析。通过将Scanpy处理得到的聚类结果映射回原始组织图像,并结合基因表达与空间邻域信息,帮助研究者直观揭示细胞类型分布、基因表达模式及空间相互作用,从而深入挖掘空间组学数据的生物学意义。

weixin_29081703的博客 446

windows服务创建带界面的窗口进程(穿透Session 0 隔离)

Windows下服务直接启动窗口程序时,在任务管理器中可以看到窗口程序正在运行,但是桌面上并没有显示出窗口。 这是因为在Windows XP、Windows Server 2003 或早期Windows 系统时代,当第一个用户登录系统后服务和应用程序是在同一个Session 中运行的,也就是Session 0。 但是这种运行方式提高了系统安全风险,因为服务是通过提升了用户权限运行的,而应用程序往往是那些不具备管理员身份的普通用户运行的,其中的危险显而易见。...

skjie的博客 5569

CVPR 2027 投稿规划:基于近3年录用率与截稿周期的5步时间管理法

本文为计算机视觉研究者提供CVPR 2027投稿的完整规划指南,基于近三年录用率与截稿周期数据,提出五步时间管理法。涵盖选题策略、实验设计、论文写作、同行评审到最终提交的全流程优化,特别针对CVPR日益激烈的竞争环境(2024年投稿量达11532篇,录取率仅23.6%)提供实用解决方案,帮助研究者提升投稿成功率。

weixin_34079177的博客 1165

别再只盯着内存溢出了!从Unity崩溃日志中揪出AssetBundle.LoadAsset_Internal的真凶

本文深入解析Unity崩溃日志中AssetBundle.LoadAsset_Internal错误的真实原因,帮助开发者超越内存溢出的表象,识别文件损坏、热更新陷阱等核心问题。通过日志分析技巧、最佳实践和高级调试方法,提供系统化的解决方案,确保Unity资源加载的稳定性。

weixin_42676824的博客 251

在Windows中,服务(Service)是一种在后台运行的程序,它不需要用户交互

在 Windows 操作系统中,**服务(Windows Service)** 是一种特殊的可执行程序(通常以 `.exe` 文件形式存在),它在 **Windows 服务控制管理器(SCM, Service Control Manager)** 的管理下,在后台持续运行,**无需用户登录或交互即可启动和运行**(支持“无会话”运行,甚至可在系统启动时、用户未登录前就运行)。服务通常用于执行系统级任务,如网络监听(如 IIS、SQL Server)、日志记录、设备驱动辅助、更新管理(如 Windows Up

[Blog][Domain] programb.blog.youkuaiyun.com 1442

VMD分子可视化实战:5个隐藏技巧让你的科研图像秒变顶刊级别

本文深入探讨了VMD分子可视化软件在科研图像美化中的5个高阶技巧,旨在帮助研究者将分子结构图提升至顶刊级别。内容涵盖原子色彩与材质的艺术化定制、沉浸式分子环境构建、专业构图与视角控制、数据驱动的动态可视化以及自动化工作流建立,通过精细的色彩映射、光照调整、周期性边界展示和脚本自动化,显著增强图像的科学叙事性与视觉冲击力。

weixin_29240343的博客 421

创建一个windows service应用程序

正是由于.net framework的出现,才使你能够构建出在系统重新启动时自动运行的、无人参与的(unattended)应用程序。by stan schultes技术工具箱:vb.net, xml, aspwindows service应用程序曾经是c++程序员专用的领域,除非你在vb中使用了第三方工具。现在它们则成为system.serviceprocess 命名空间下的.net f...

acg98401的博客 312

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

在Azure中创建一个“Hello World”应用程序

在本文中,我们将会讨论如何使用.NET在Azure中创建一个“Hello World!!!”应用程序。我使用安装了Azure SDK 1.3的Visual Studio 2010。启动Visual Studio,然后创建一个新项目。在“Cloud”模板中选择“Windows Azure Cloud Service”。 点击了“OK”以后,它会让你选择一个“Role”。这里,我们添加了一个AS...

weixin_30337251的博客 152

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

WinForm 和 Windows Service 通信 消息队列

<br />如题,WinForm 和 Windows Service 通信,就是应用程序和系统服务通信,可以看成是进程间的通信。通信的方式有很多,这里只介绍通过消息队列(MessageQueue)方式。理论知识就不介绍了,直接介绍实例吧。<br />一、建立工程<br />建立3个项目,其中,<br />Common 为类库,包含错误日志类(Log.cs)和数据库访问类(MsSql.cs)<br />ServiceDemo 为Windows Service服务,包含安装类(Installer1.cs)和服务

Carter的菜园子 2170

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

使用Windows Azure Mobile Service开发Windows Phone 8 App

- How to make a Windows Phone 8 app with Windows Azure Mobile Service Windows Azure Mobile Service推出已经有一段时间了,这可能是这段时间以来Windows Azure上最受关注的一个Feature,试用了一下Mobile Service,觉得还不错,分享下试用的过程,供大家参考。 新建一个Mobi...

weixin_30662539的博客 200

C#创建和使用webservice

一、 创建c#的webservice工程 : File -> New project -> ASP.net Web Service Application -> OK  创建的工程中有一个属性为WebMethod的方法,即是我们可调用的Web Service方法。

静以修身 754

Windows Azure Service Bus (5) 主题(Topic) 使用VS2013开发Service Bus Topic

 《Windows Azure Platform 系列文章目录》   项目文件,请在这里下载   在笔者之前的文章中Windows Azure Service Bus (1) 基础   介绍了Service Bus支持主题(Topic)。如下图:      当2个客户端同时订阅了相同的主题(Topic)。当向这个Topic发送消息的时候,2个客户...

weixin_34232744的博客 223

Visual Studio IDE改进:快速创建云程序

微软将会预先推出一款针对Visual Studio IDE的基于云计算应用的创建服务及改进,以使得创建SharePoint 程序更加容易。 通过扩展公司的Team Foundation Service 平台,开发者们可以在Windows Azure公共云上创建源代码。Team Foundation Service 主要是公司的Team Foundation Server 应用程序生命周期的管理服

蓝色月光 441

Window Service程序中如何获取登陆用户的信息

在window form程序中, 获取当前用户的信息是很容易的一件事情。然而,在window service中, 如何获取当前活动的(登陆的)用户的信息,.NET 并没有给出一种很容易的方法。多数情况下,用户需要调用底层API以达到此目的。如果想在services中启动一个线程并且运行在当前活动的用户UI界面上,获取当前活动的用户,更是必须的操作。 在windows底层的a...

weixin_30480583的博客 508

如何用C#创建Windows Service

在.Net中用C#创建Windows Service,其实很简单,按照以下的步骤就可以做出一个简单的Windows Service。1.首先在创建工程的时候选择Windows Service,这样.Net会自动生成Windows Service的框架;2.完成Windows Service的相应事件,主要是OnStart和OnStop这两个事件,完成后大致代码如下:using Syst

愚翁专栏 1万+

Windows Service 开发系列(一) 什么是Windows Service应用程序?

什么是Windows  Service应用程序?    Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这些功能使服务非常适合在服务器 上使用,每当需要使用不会影响在同一台计算机上工作的其他用户的功能时也适用。还可以在不同于登

Wind_Eagle的专栏 8826

用QT创建一个Windows Service以及踩到的若干坑

因为项目需要,做一个Tech Spike,看看用QT如何创建一个Windows Service,并实现触摸某硬件而弹出某应用程序的功能。 一、自然的思路 为实现“触摸某硬件而弹出某应用程序”,首先想到的是,这个触摸动作触发了一个特定的signal,而QObject的connect()函数就将这个signal与加载应用程序的动作连接起来,这样就实现了此功能。

FinixLei的专栏 (https://github.com/FinixLei) 2万+
上一篇: WMI 的一个实现
下一篇: 重新启动服务
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值