主题:[讨论].NET下开发Windows 服务应用程序
Windows 服务应用程序介绍
Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这使服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务。
创建 Windows 服务
当创建服务时,可以使用称作 Windows 服务的 Visual Studio .NET 项目模板。此模板引用适当的类和命名空间、设置从服务基类的继承并重写您可能要重写的几种方法,从而自动为您完成大部分工作。
若要创建功能性服务,必须至少:
设置 ServiceName 属性。
为服务应用程序创建必需的安装程序。
重写 OnStart 和 OnStop 方法并为其指定代码以自定义服务的行为方式。
在将安装程序添加到应用程序之后,下一步是创建安装项目,该项目将安装已编译的项目文件并运行安装服务所需的安装程序。若要创建完整的安装项目,您必须将服务项目的输出添加到该安装项目,然后添加自定义操作以安装您的服务。
创建一个 Windows 服务项目。
在“属性”窗口中,设置服务的 ServiceName 属性。 (注意 ServiceName 属性的值必须始终与安装程序类中记录的名称匹配。如果更改此属性,还必须更新安装程序类中的 ServiceName 属性。)
设置下列所有属性以确定服务的工作机制。 属性 设置
CanStop True 表示服务将接受停止运行的请求;false 表示禁止服务停止。
CanShutDown True 表示服务希望在运行它的计算机关闭时收到通知,以便能够调用 OnShutDown 过程。
CanPauseAndContinue True 表示服务将接受暂停或继续运行的请求;false 表示禁止服务暂停和继续。
CanHandlePowerEvent True 表示该服务可以处理有关计算机电源状态更改的通知;false 表示禁止服务得到有关这些更改的通知。
AutoLog True 表示在服务执行操作时将信息项写入应用程序的事件日志;false 表示禁用此功能。(注意 默认为 true。)
注意 当 CanStop 或 CanPauseandContinue 设置为 false 时,服务控制管理器将禁用停止、暂停或继续服务的相应菜单选项。
访问代码编辑器,并为 OnStart 和 OnStop 过程填写所需的处理。
重写其他所有要为其定义功能的方法。
添加服务应用程序所必需的安装程序。
通过从“生成”菜单中选择“生成解决方案”来生成项目。 (注意 不要通过按 F5 键来运行项目,不能以这种方式运行服务项目。)
实例:
新建一个名为MyService的Windows服务项目,将Service1.cs及代码里的类名改为你想要的名字,我这里统一用MyService;
using System.Threading;
一个后台服务线程,private Thread backThread=null;
在构造函数里实例化线程,this.backThread=new Thread(new ThreadStart(this.Running));
在类里添加private void Running(){}方法,一般要让线程一直处于运行状态来处理你给它安排的工作,例如根据消息队列里的消息,执行下载任务下载文件。
private void Running()
{
while(true)
{
//你的处理
Thread.Sleep(5*1000);//例如让线程休眠5秒
}
}
重写线程的控制函数
protected override void OnStart(string[] args)
{
this.backThread.Start();
}
protected override void OnStop()
{
this.backThread.Abort();
}
protected override void OnPause()
{
this.backThread.Suspend();
}
protected override void OnContinue()
{
this.backThread.Resume();
}
同时你也可以根据需要按照上面表格所列的属性进行设置。
在该项目上点右键选择添加-添加类-安装程序类,取名Install.cs
在Install.cs的视图设计器里为它添加ServiceInstall和ServiceProcessInstall控件,可以为这2个控件设置属性,例如可以在ServiceInstall的ServiceDependedOn属性里设置服务依赖。
生成解决方案,下面介绍如何安装服务
安装和卸载服务
手动安装服务
访问项目中的已编译可执行文件所在的目录。
用项目的输出作为参数,从命令行运行 InstallUtil.exe。在命令行中输入下列代码:
installutil yourproject.exe
手动卸载服务
用项目的输出作为参数,从命令行运行 InstallUtil.exe。在命令行中输入下列代码:
installutil /u yourproject.exe
调试 Windows 服务应用程序
由于服务必须从服务控制管理器的上下文中运行,而不是从 Visual Studio .NET 中运行,因此调试服务不像调试其他 Visual Studio 应用程序类型那样简单。若要调试服务,必须首先启动服务,然后将一个调试器附加到正在运行服务的进程中。然后可以使用 Visual Studio 的所有标准调试功能来调试应用程序。
警告 除非知道进程是什么,并且知道附加到进程或可能会取消进程所带来的后果,否则不要附加到进程。例如,如果附加到 WinLogon 进程,然后停止调试,系统就会暂停,因为没有 WinLogon,系统无法运行。
只能将调试器附加到正在运行的服务。附加进程会中断服务的当前运行;它并不真正终止或暂停服务的处理。也就是说,如果开始调试时服务正在运行,则在进行调试时,该服务从技术上说仍处于“已启动”状态,但它的处理已挂起。
附加到服务的进程使您能够调试大多数服务代码,但并非全部;例如,由于服务已经启动,因此不能用这种方法调试服务的 OnStart 方法中的代码,或调试用于加载服务的 Main 方法中的代码。解决此问题的一个方法是:在唯一作用是帮助调试的服务应用程序中创建一个临时服务。可以将两个服务都安装上,然后启动此“虚拟”服务加载服务进程。临时服务启动了进程后,就可以使用 Visual Studio .NET 中的“调试”菜单来附加到服务进程。
当附加该进程之后,可以设置断点并使用这些断点来调试代码。当退出用于附加到该进程的对话框时,实际上已处于调试模式。您可以使用服务控制管理器开始、停止、暂停和继续您的服务,因此命中已设置的断点。调试成功后,移除此“虚拟”服务。
注意 调试 OnStart 方法可能比较困难,因为 Windows 服务管理器将所有尝试启动服务的时间限制在 30 秒内。当调试 Windows 服务应用程序时,服务与“Windows 服务管理器”进行交互。“服务管理器”通过调用 OnStart 方法启动服务,然后花 30 秒时间等待 OnStart 方法返回。如果在这段时间内方法没有返回,管理器将显示一个服务无法启动的错误。如果在 OnStart 方法中放置一个断点并且在 30 秒内不通过该断点,则管理器不会启动服务。
调试服务
安装您的服务。
可从服务控制管理器、“服务器资源管理器”或代码启动服务。
在 Visual Studio 中,从“调试”菜单中选择“进程”。 出现“进程”对话框。
单击“显示系统进程”。
在“可用进程”区域内单击服务的进程,然后单击“附加”。 (提示 此进程将与服务的可执行文件同名。)出现“附加到进程”对话框。
选择任意适当选项,然后单击“确定”关闭对话框。 (注意 您现在已处于调试模式。)
设置要在代码中使用的任意断点。
访问服务控制管理器并操纵您的服务,并发送停止、暂停和继续命令以命中您的断点。
本人对Windows Service的理解还不是很透彻,欢迎和我讨论,共同学习。
Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这使服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务。
创建 Windows 服务
当创建服务时,可以使用称作 Windows 服务的 Visual Studio .NET 项目模板。此模板引用适当的类和命名空间、设置从服务基类的继承并重写您可能要重写的几种方法,从而自动为您完成大部分工作。
若要创建功能性服务,必须至少:
设置 ServiceName 属性。
为服务应用程序创建必需的安装程序。
重写 OnStart 和 OnStop 方法并为其指定代码以自定义服务的行为方式。
在将安装程序添加到应用程序之后,下一步是创建安装项目,该项目将安装已编译的项目文件并运行安装服务所需的安装程序。若要创建完整的安装项目,您必须将服务项目的输出添加到该安装项目,然后添加自定义操作以安装您的服务。
创建一个 Windows 服务项目。
在“属性”窗口中,设置服务的 ServiceName 属性。 (注意 ServiceName 属性的值必须始终与安装程序类中记录的名称匹配。如果更改此属性,还必须更新安装程序类中的 ServiceName 属性。)
设置下列所有属性以确定服务的工作机制。 属性 设置
CanStop True 表示服务将接受停止运行的请求;false 表示禁止服务停止。
CanShutDown True 表示服务希望在运行它的计算机关闭时收到通知,以便能够调用 OnShutDown 过程。
CanPauseAndContinue True 表示服务将接受暂停或继续运行的请求;false 表示禁止服务暂停和继续。
CanHandlePowerEvent True 表示该服务可以处理有关计算机电源状态更改的通知;false 表示禁止服务得到有关这些更改的通知。
AutoLog True 表示在服务执行操作时将信息项写入应用程序的事件日志;false 表示禁用此功能。(注意 默认为 true。)
注意 当 CanStop 或 CanPauseandContinue 设置为 false 时,服务控制管理器将禁用停止、暂停或继续服务的相应菜单选项。
访问代码编辑器,并为 OnStart 和 OnStop 过程填写所需的处理。
重写其他所有要为其定义功能的方法。
添加服务应用程序所必需的安装程序。
通过从“生成”菜单中选择“生成解决方案”来生成项目。 (注意 不要通过按 F5 键来运行项目,不能以这种方式运行服务项目。)
实例:
新建一个名为MyService的Windows服务项目,将Service1.cs及代码里的类名改为你想要的名字,我这里统一用MyService;
using System.Threading;
一个后台服务线程,private Thread backThread=null;
在构造函数里实例化线程,this.backThread=new Thread(new ThreadStart(this.Running));
在类里添加private void Running(){}方法,一般要让线程一直处于运行状态来处理你给它安排的工作,例如根据消息队列里的消息,执行下载任务下载文件。
private void Running()
{
while(true)
{
//你的处理
Thread.Sleep(5*1000);//例如让线程休眠5秒
}
}
重写线程的控制函数
protected override void OnStart(string[] args)
{
this.backThread.Start();
}
protected override void OnStop()
{
this.backThread.Abort();
}
protected override void OnPause()
{
this.backThread.Suspend();
}
protected override void OnContinue()
{
this.backThread.Resume();
}
同时你也可以根据需要按照上面表格所列的属性进行设置。
在该项目上点右键选择添加-添加类-安装程序类,取名Install.cs
在Install.cs的视图设计器里为它添加ServiceInstall和ServiceProcessInstall控件,可以为这2个控件设置属性,例如可以在ServiceInstall的ServiceDependedOn属性里设置服务依赖。
生成解决方案,下面介绍如何安装服务
安装和卸载服务
手动安装服务
访问项目中的已编译可执行文件所在的目录。
用项目的输出作为参数,从命令行运行 InstallUtil.exe。在命令行中输入下列代码:
installutil yourproject.exe
手动卸载服务
用项目的输出作为参数,从命令行运行 InstallUtil.exe。在命令行中输入下列代码:
installutil /u yourproject.exe
调试 Windows 服务应用程序
由于服务必须从服务控制管理器的上下文中运行,而不是从 Visual Studio .NET 中运行,因此调试服务不像调试其他 Visual Studio 应用程序类型那样简单。若要调试服务,必须首先启动服务,然后将一个调试器附加到正在运行服务的进程中。然后可以使用 Visual Studio 的所有标准调试功能来调试应用程序。
警告 除非知道进程是什么,并且知道附加到进程或可能会取消进程所带来的后果,否则不要附加到进程。例如,如果附加到 WinLogon 进程,然后停止调试,系统就会暂停,因为没有 WinLogon,系统无法运行。
只能将调试器附加到正在运行的服务。附加进程会中断服务的当前运行;它并不真正终止或暂停服务的处理。也就是说,如果开始调试时服务正在运行,则在进行调试时,该服务从技术上说仍处于“已启动”状态,但它的处理已挂起。
附加到服务的进程使您能够调试大多数服务代码,但并非全部;例如,由于服务已经启动,因此不能用这种方法调试服务的 OnStart 方法中的代码,或调试用于加载服务的 Main 方法中的代码。解决此问题的一个方法是:在唯一作用是帮助调试的服务应用程序中创建一个临时服务。可以将两个服务都安装上,然后启动此“虚拟”服务加载服务进程。临时服务启动了进程后,就可以使用 Visual Studio .NET 中的“调试”菜单来附加到服务进程。
当附加该进程之后,可以设置断点并使用这些断点来调试代码。当退出用于附加到该进程的对话框时,实际上已处于调试模式。您可以使用服务控制管理器开始、停止、暂停和继续您的服务,因此命中已设置的断点。调试成功后,移除此“虚拟”服务。
注意 调试 OnStart 方法可能比较困难,因为 Windows 服务管理器将所有尝试启动服务的时间限制在 30 秒内。当调试 Windows 服务应用程序时,服务与“Windows 服务管理器”进行交互。“服务管理器”通过调用 OnStart 方法启动服务,然后花 30 秒时间等待 OnStart 方法返回。如果在这段时间内方法没有返回,管理器将显示一个服务无法启动的错误。如果在 OnStart 方法中放置一个断点并且在 30 秒内不通过该断点,则管理器不会启动服务。
调试服务
安装您的服务。
可从服务控制管理器、“服务器资源管理器”或代码启动服务。
在 Visual Studio 中,从“调试”菜单中选择“进程”。 出现“进程”对话框。
单击“显示系统进程”。
在“可用进程”区域内单击服务的进程,然后单击“附加”。 (提示 此进程将与服务的可执行文件同名。)出现“附加到进程”对话框。
选择任意适当选项,然后单击“确定”关闭对话框。 (注意 您现在已处于调试模式。)
设置要在代码中使用的任意断点。
访问服务控制管理器并操纵您的服务,并发送停止、暂停和继续命令以命中您的断点。
本人对Windows Service的理解还不是很透彻,欢迎和我讨论,共同学习。