C#2.0 编写window服务(msdn)
注意
Visual Studio 标准版中不提供“Windows 服务”模板及相关功能。有关更多信息,请参见 Visual Studio 版本。
本主题中的步骤引导您完成创建简单的向事件日志写入消息的 Windows 服务应用程序的过程。创建和使用服务所执行的基本步骤包括:
*
使用“Windows 服务”应用程序模板创建项目。此模板为您创建一个从 ServiceBase 继承的类,并编写大量基本服务代码,例如启动服务的代码。
*
编写 OnStart 和 OnStop 过程的代码,并重写要重新定义的任何其他方法。
*
添加服务应用程序所必需的安装程序。默认情况下,当单击“添加安装程序”链接时,一个包含两个或多个安装程序的类将被添加到应用程序中:一个用于安装进程,其他安装程序中的每一个用于项目包含的每个关联服务。
*
生成您的项目。
*
创建安装项目以安装服务,然后进行安装。
*
访问 Windows 2000 服务控制管理器并启动您的服务。
首先,创建项目并设置服务正常运行所必需的值。
创建服务
创建并配置服务
1.
在“文件”菜单上单击“新建项目”。
打开“新建项目”对话框。
2.
在 Visual Basic、Visual C#、Visual C++ 或 Visual J# 项目模板的列表中选择“Windows 服务”项目,并将其命名为 MyNewService。单击“确定”。
注意
项目模板自动添加从 System.ServiceProcess.ServiceBase 继承的名为 Service1 的组件类。
3.
单击设计器选择 Service1。然后,在“属性”窗口中,将 Service1 的 ServiceName 和“(名称)”属性设置为“MyNewService”。
4.
将 AutoLog 属性设置为 true。
5.
在“视图”菜单中单击“代码”以打开“代码编辑器”。编辑 Main 方法以创建“MyNewService”的实例。当在步骤 3 中重命名服务时,未在 Main 方法中修改类名。
Visual Basic?
' To access the Main method in Visual Basic, select Main from the
' method name drop-down list. This expands the Component Designer
' generated code region.
Shared Sub Main()
Dim ServicesToRun() As System.ServiceProcess.ServiceBase
' Change the following line to match.
ServicesToRun = New System.ServiceProcess.ServiceBase() _
{New MyNewService()}
System.ServiceProcess.ServiceBase.Run(ServicesToRun)
End Sub
static void Main()
{
System.ServiceProcess.ServiceBase[] ServicesToRun;
// Change the following line to match.
ServicesToRun = new System.ServiceProcess.ServiceBase[]
{ new MyNewService() };
System.ServiceProcess.ServiceBase.Run(ServicesToRun);
}
向服务添加功能
在下一节中,您将把自定义事件日志添加到 Windows 服务中。事件日志与 Windows 服务没有任何形式的关联。此处,EventLog 组件用作可以添加到 Windows 服务的组件类型的示例。有关自定义事件日志的更多信息,请参见如何:创建和移除自定义事件日志。
将自定义事件日志功能添加到服务中
1.
在“解决方案资源管理器”中,右击“Service1.vb”、“Service1.cs”或“Service1.jsl”,并选择“视图设计器”。
2.
从“工具箱”的“组件”选项卡,将 EventLog 组件拖到设计器中。
3.
在“解决方案资源管理器”中,右击“Service1.vb”、“Service1.cs”或“Service1.jsl”,并选择“查看代码”。
4.
编辑构造函数以定义一个用户事件日志。
Visual Basic?
' To access the constructor in Visual Basic, select New from the
' method name drop-down list.
Public Sub New()
MyBase.New()
InitializeComponent()
If Not System.Diagnostics.EventLog.SourceExists("MySource") Then
System.Diagnostics.EventLog.CreateEventSource("MySource", _
"MyNewLog")
End If
EventLog1.Source = "MySource"
EventLog1.Log = "MyNewLog"
End Sub
public MyNewService()
{
InitializeComponent();
if (!System.Diagnostics.EventLog.SourceExists("MySource"))
{
System.Diagnostics.EventLog.CreateEventSource(
"MySource","MyNewLog");
}
eventLog1.Source = "MySource";
eventLog1.Log = "MyNewLog";
}
定义当服务启动时发生的情况
*
在代码编辑器中,找到创建项目时被自动重写的 OnStart 方法,并编写代码来确定当服务开始运行时发生的情况:
Visual Basic?
' To access the OnStart in Visual Basic, select OnStart from the
' method name drop-down list.
Protected Overrides Sub OnStart(ByVal args() As String)
EventLog1.WriteEntry("In OnStart")
End Sub
protected override void OnStart(string[] args)
{
eventLog1.WriteEntry("In OnStart");
}
注意
服务应用程序设计为长时间运行。因此,它通常轮询或监视系统中的情况。监视是在 OnStart 方法中设置的。但是,OnStart 实际上不进行监视。一旦服务的操作开始,OnStart 方法必须返回到操作系统。它不能始终循环或阻止。若要设置简单的轮询机制,可以使用 System.Timers.Timer 组件。在 OnStart 方法中,可以设置组件上的参数,然后将 Enabled 属性设置为 true。然后,计时器将在代码中周期性地引发事件,此时,服务可以进行其监视工作。
定义当服务停止时发生的情况
*
在“代码编辑器”中,从“方法名称”下拉列表中选择 OnStop 过程,该过程是创建项目时自动重写的。编写代码以确定服务停止时发生的情况:
Visual Basic?
Protected Overrides Sub OnStop()
EventLog1.WriteEntry("In OnStop.")
End Sub
protected override void OnStop()
{
eventLog1.WriteEntry("In onStop.");
}
还可以重写 OnPause、OnContinue 和 OnShutdown 方法来定义对组件的进一步处理。
定义服务的其他操作
*
对于要处理的方法,重写适当的方法并定义要发生的操作。
下面的代码显示重写 OnContinue 方法时代码的情况:
Visual Basic?
Protected Overrides Sub OnContinue()
EventLog1.WriteEntry("In OnContinue.")
End Sub
protected override void OnContinue()
{
eventLog1.WriteEntry("In OnContinue.");
}
安装 Windows 服务时需要执行某些自定义操作,这可以由 Installer 类来完成。Visual Studio 可以专门为 Windows 服务创建这些安装程序并将它们添加到项目中。
为服务创建安装程序
1.
在“解决方案资源管理器”中,右击“Service1.vb”、“Service1.cs”或“Service1.jsl”,并选择“视图设计器”。
2.
单击设计器的背景以选择服务本身,而不是它的任何内容。
3.
设计器具有焦点时,右击然后单击“添加安装程序”。
默认情况下,向您的项目添加包含两个安装程序的组件类。将该组件命名为 ProjectInstaller,它包含的安装程序分别是服务的安装程序和服务关联进程的安装程序。
4.
在“ProjectInstaller”的“设计”视图中,单击“ServiceInstaller1”或“serviceInstaller1”。
5.
在“属性”窗口中,将 ServiceName 属性设置为“MyNewService”。
6.
将 StartType 属性设置为 Automatic。
7.
在设计器中单击“ServiceProcessInstaller1”(对于 Visual Basic 项目)或“serviceProcessInstaller1”(对于 Visual C# 或 Visual J# 项目)。将 Account 属性设置为 LocalService。这将使得在本地服务帐户上安装和运行该服务。
安全注意
LocalService 帐户用作本地计算机上的非特权用户,向任何远程服务器显示匿名凭据。使用其他帐户时需要特别小心,因此它们具有较高的特权,会增加您受到恶意代码攻击的风险。
生成服务项目
1.
在“解决方案资源管理器”中,右击选择您的项目并从快捷菜单中选择“属性”。出现项目的“属性设计器”。
2.
从“应用程序”页的“启动对象”列表中选择“MyNewService”。
3.
按 Ctrl+Shift+B 生成项目。
生成项目后,便可以对其进行部署了。安装项目将安装已编译的项目文件并运行要运行 Windows 服务所需的安装程序。若要创建完整的安装项目,您需要将项目输出 MyNewService.exe 添加到安装项目,然后添加自定义操作来安装 MyNewService.exe。有关安装项目的更多信息,请参见安装项目。有关自定义操作的更多信息,请参见演练:创建自定义操作。
为服务创建安装项目
1.
在“解决方案资源管理器”中,右击选择解决方案,指向“添加”,然后单击“新建项目”。
2.
在“项目类型”窗格中选择“安装和部署项目”文件夹。
3.
在“模板”窗格中选择“安装项目”。将项目命名为 MyServiceSetup。单击“确定”。
安装项目随即添加到解决方案。
然后,将 Windows 服务项目的输出 MyNewService.exe 添加到安装项目中。
向安装项目添加 MyNewService.exe
1.
在“解决方案资源管理器”中,右击“MyServiceSetup”,指向“添加”,然后选择“项目输出”。
出现“添加项目输出组”对话框。
2.
并且在“项目”框中选择了“MyNewService”。
3.
在列表框中,选择“主输出”,再单击“确定”。
MyNewService 的主输出的项目项被添加到安装项目中。
现在添加自定义操作以安装 MyNewService.exe 文件。
向安装项目添加自定义操作
1.
在“解决方案资源管理器”中右击安装项目,指向“视图”,再选择“自定义操作”。
出现“自定义操作”编辑器。
2.
在“自定义操作”编辑器中右击“自定义操作”节点,再选择“添加自定义操作”。
出现“选择项目中的项”对话框。
3.
在列表框中双击“应用程序文件夹”以将其打开,选择“MyNewService 的主输出(活动)”,再单击“确定”。
主输出被添加到自定义操作的所有四个节点:“安装”、“提交”、“回滚”和“卸载”。
4.
在“解决方案资源管理器”中,右击“MyServiceSetup”项目并选择“生成”。
安装 Windows 服务
1.
若要安装“MyNewService.exe”,请右击“解决方案资源管理器”中的安装项目,再选择“安装”。
2.
完成“安装向导”中的步骤。生成并保存您的解决方案。
启动和停止服务
1.
通过执行下列操作之一打开服务控制管理器:
*
在 Windows XP 和 2000 专业版中,在桌面上右击“我的电脑”,再单击“管理”。在“计算机管理”控制台中,展开“服务和应用程序”节点。
- 或 -
*
在 Windows 2003 Server 和 Windows 2000 Server 中,单击“开始”,指向“程序”,单击“管理工具”,然后单击“服务”。
注意
在 Windows NT 4.0 版中,可以从“控制面板”中打开此对话框。
现在应该看到“MyNewService”列在窗口的“服务”区域中。
2.
从列表中选择您的服务,右击该服务,然后单击“启动”。
3.
右击该服务,再单击“停止”。
验证服务的事件日志输出
1.
打开“服务器资源管理器”并访问“事件日志”节点。有关更多信息,请参见如何:在服务器资源管理器中使用事件日志。
注意
Visual Studio 标准版中不提供“Windows 服务”模板及相关功能。有关更多信息,请参见 Visual Studio 版本。
2.
找到 MyNewLog 的列表并展开它。您应该看到服务所执行操作的项。
卸载服务
1.
在“开始”菜单上打开“控制面板”并单击“添加/删除程序”,再找到您的服务并单击“卸载”。
2.
还可以通过右击 .msi 文件的程序图标并选择“卸载”来卸载该程序。
注意
如果在 Windows 2000 上安装了服务,则需要重新启动系统才能重新安装服务。在 Windows 2000 中,服务在系统重新启动之前不会完全删除。
后续步骤
可以利用 ServiceController 组件将命令发送到已安装的服务。有关使用 ServiceController 控件的更多信息,请参见监视 Windows 服务。
可以在安装应用程序时使用安装程序创建事件日志,而不是在运行应用程序时创建事件日志。此外,在卸载应用程序时,事件日志将被安装程序删除。有关更多信息,请参见演练:安装事件日志组件。
注意
Visual Studio 标准版中不提供“Windows 服务”模板及相关功能。有关更多信息,请参见 Visual Studio 版本。
本主题中的步骤引导您完成创建简单的向事件日志写入消息的 Windows 服务应用程序的过程。创建和使用服务所执行的基本步骤包括:
*
使用“Windows 服务”应用程序模板创建项目。此模板为您创建一个从 ServiceBase 继承的类,并编写大量基本服务代码,例如启动服务的代码。
*
编写 OnStart 和 OnStop 过程的代码,并重写要重新定义的任何其他方法。
*
添加服务应用程序所必需的安装程序。默认情况下,当单击“添加安装程序”链接时,一个包含两个或多个安装程序的类将被添加到应用程序中:一个用于安装进程,其他安装程序中的每一个用于项目包含的每个关联服务。
*
生成您的项目。
*
创建安装项目以安装服务,然后进行安装。
*
访问 Windows 2000 服务控制管理器并启动您的服务。
首先,创建项目并设置服务正常运行所必需的值。
创建服务
创建并配置服务
1.
在“文件”菜单上单击“新建项目”。
打开“新建项目”对话框。
2.
在 Visual Basic、Visual C#、Visual C++ 或 Visual J# 项目模板的列表中选择“Windows 服务”项目,并将其命名为 MyNewService。单击“确定”。
注意
项目模板自动添加从 System.ServiceProcess.ServiceBase 继承的名为 Service1 的组件类。
3.
单击设计器选择 Service1。然后,在“属性”窗口中,将 Service1 的 ServiceName 和“(名称)”属性设置为“MyNewService”。
4.
将 AutoLog 属性设置为 true。
5.
在“视图”菜单中单击“代码”以打开“代码编辑器”。编辑 Main 方法以创建“MyNewService”的实例。当在步骤 3 中重命名服务时,未在 Main 方法中修改类名。
Visual Basic?
' To access the Main method in Visual Basic, select Main from the
' method name drop-down list. This expands the Component Designer
' generated code region.
Shared Sub Main()
Dim ServicesToRun() As System.ServiceProcess.ServiceBase
' Change the following line to match.
ServicesToRun = New System.ServiceProcess.ServiceBase() _
{New MyNewService()}
System.ServiceProcess.ServiceBase.Run(ServicesToRun)
End Sub
static void Main()
{
System.ServiceProcess.ServiceBase[] ServicesToRun;
// Change the following line to match.
ServicesToRun = new System.ServiceProcess.ServiceBase[]
{ new MyNewService() };
System.ServiceProcess.ServiceBase.Run(ServicesToRun);
}
向服务添加功能
在下一节中,您将把自定义事件日志添加到 Windows 服务中。事件日志与 Windows 服务没有任何形式的关联。此处,EventLog 组件用作可以添加到 Windows 服务的组件类型的示例。有关自定义事件日志的更多信息,请参见如何:创建和移除自定义事件日志。
将自定义事件日志功能添加到服务中
1.
在“解决方案资源管理器”中,右击“Service1.vb”、“Service1.cs”或“Service1.jsl”,并选择“视图设计器”。
2.
从“工具箱”的“组件”选项卡,将 EventLog 组件拖到设计器中。
3.
在“解决方案资源管理器”中,右击“Service1.vb”、“Service1.cs”或“Service1.jsl”,并选择“查看代码”。
4.
编辑构造函数以定义一个用户事件日志。
Visual Basic?
' To access the constructor in Visual Basic, select New from the
' method name drop-down list.
Public Sub New()
MyBase.New()
InitializeComponent()
If Not System.Diagnostics.EventLog.SourceExists("MySource") Then
System.Diagnostics.EventLog.CreateEventSource("MySource", _
"MyNewLog")
End If
EventLog1.Source = "MySource"
EventLog1.Log = "MyNewLog"
End Sub
public MyNewService()
{
InitializeComponent();
if (!System.Diagnostics.EventLog.SourceExists("MySource"))
{
System.Diagnostics.EventLog.CreateEventSource(
"MySource","MyNewLog");
}
eventLog1.Source = "MySource";
eventLog1.Log = "MyNewLog";
}
定义当服务启动时发生的情况
*
在代码编辑器中,找到创建项目时被自动重写的 OnStart 方法,并编写代码来确定当服务开始运行时发生的情况:
Visual Basic?
' To access the OnStart in Visual Basic, select OnStart from the
' method name drop-down list.
Protected Overrides Sub OnStart(ByVal args() As String)
EventLog1.WriteEntry("In OnStart")
End Sub
protected override void OnStart(string[] args)
{
eventLog1.WriteEntry("In OnStart");
}
注意
服务应用程序设计为长时间运行。因此,它通常轮询或监视系统中的情况。监视是在 OnStart 方法中设置的。但是,OnStart 实际上不进行监视。一旦服务的操作开始,OnStart 方法必须返回到操作系统。它不能始终循环或阻止。若要设置简单的轮询机制,可以使用 System.Timers.Timer 组件。在 OnStart 方法中,可以设置组件上的参数,然后将 Enabled 属性设置为 true。然后,计时器将在代码中周期性地引发事件,此时,服务可以进行其监视工作。
定义当服务停止时发生的情况
*
在“代码编辑器”中,从“方法名称”下拉列表中选择 OnStop 过程,该过程是创建项目时自动重写的。编写代码以确定服务停止时发生的情况:
Visual Basic?
Protected Overrides Sub OnStop()
EventLog1.WriteEntry("In OnStop.")
End Sub
protected override void OnStop()
{
eventLog1.WriteEntry("In onStop.");
}
还可以重写 OnPause、OnContinue 和 OnShutdown 方法来定义对组件的进一步处理。
定义服务的其他操作
*
对于要处理的方法,重写适当的方法并定义要发生的操作。
下面的代码显示重写 OnContinue 方法时代码的情况:
Visual Basic?
Protected Overrides Sub OnContinue()
EventLog1.WriteEntry("In OnContinue.")
End Sub
protected override void OnContinue()
{
eventLog1.WriteEntry("In OnContinue.");
}
安装 Windows 服务时需要执行某些自定义操作,这可以由 Installer 类来完成。Visual Studio 可以专门为 Windows 服务创建这些安装程序并将它们添加到项目中。
为服务创建安装程序
1.
在“解决方案资源管理器”中,右击“Service1.vb”、“Service1.cs”或“Service1.jsl”,并选择“视图设计器”。
2.
单击设计器的背景以选择服务本身,而不是它的任何内容。
3.
设计器具有焦点时,右击然后单击“添加安装程序”。
默认情况下,向您的项目添加包含两个安装程序的组件类。将该组件命名为 ProjectInstaller,它包含的安装程序分别是服务的安装程序和服务关联进程的安装程序。
4.
在“ProjectInstaller”的“设计”视图中,单击“ServiceInstaller1”或“serviceInstaller1”。
5.
在“属性”窗口中,将 ServiceName 属性设置为“MyNewService”。
6.
将 StartType 属性设置为 Automatic。
7.
在设计器中单击“ServiceProcessInstaller1”(对于 Visual Basic 项目)或“serviceProcessInstaller1”(对于 Visual C# 或 Visual J# 项目)。将 Account 属性设置为 LocalService。这将使得在本地服务帐户上安装和运行该服务。
安全注意
LocalService 帐户用作本地计算机上的非特权用户,向任何远程服务器显示匿名凭据。使用其他帐户时需要特别小心,因此它们具有较高的特权,会增加您受到恶意代码攻击的风险。
生成服务项目
1.
在“解决方案资源管理器”中,右击选择您的项目并从快捷菜单中选择“属性”。出现项目的“属性设计器”。
2.
从“应用程序”页的“启动对象”列表中选择“MyNewService”。
3.
按 Ctrl+Shift+B 生成项目。
生成项目后,便可以对其进行部署了。安装项目将安装已编译的项目文件并运行要运行 Windows 服务所需的安装程序。若要创建完整的安装项目,您需要将项目输出 MyNewService.exe 添加到安装项目,然后添加自定义操作来安装 MyNewService.exe。有关安装项目的更多信息,请参见安装项目。有关自定义操作的更多信息,请参见演练:创建自定义操作。
为服务创建安装项目
1.
在“解决方案资源管理器”中,右击选择解决方案,指向“添加”,然后单击“新建项目”。
2.
在“项目类型”窗格中选择“安装和部署项目”文件夹。
3.
在“模板”窗格中选择“安装项目”。将项目命名为 MyServiceSetup。单击“确定”。
安装项目随即添加到解决方案。
然后,将 Windows 服务项目的输出 MyNewService.exe 添加到安装项目中。
向安装项目添加 MyNewService.exe
1.
在“解决方案资源管理器”中,右击“MyServiceSetup”,指向“添加”,然后选择“项目输出”。
出现“添加项目输出组”对话框。
2.
并且在“项目”框中选择了“MyNewService”。
3.
在列表框中,选择“主输出”,再单击“确定”。
MyNewService 的主输出的项目项被添加到安装项目中。
现在添加自定义操作以安装 MyNewService.exe 文件。
向安装项目添加自定义操作
1.
在“解决方案资源管理器”中右击安装项目,指向“视图”,再选择“自定义操作”。
出现“自定义操作”编辑器。
2.
在“自定义操作”编辑器中右击“自定义操作”节点,再选择“添加自定义操作”。
出现“选择项目中的项”对话框。
3.
在列表框中双击“应用程序文件夹”以将其打开,选择“MyNewService 的主输出(活动)”,再单击“确定”。
主输出被添加到自定义操作的所有四个节点:“安装”、“提交”、“回滚”和“卸载”。
4.
在“解决方案资源管理器”中,右击“MyServiceSetup”项目并选择“生成”。
安装 Windows 服务
1.
若要安装“MyNewService.exe”,请右击“解决方案资源管理器”中的安装项目,再选择“安装”。
2.
完成“安装向导”中的步骤。生成并保存您的解决方案。
启动和停止服务
1.
通过执行下列操作之一打开服务控制管理器:
*
在 Windows XP 和 2000 专业版中,在桌面上右击“我的电脑”,再单击“管理”。在“计算机管理”控制台中,展开“服务和应用程序”节点。
- 或 -
*
在 Windows 2003 Server 和 Windows 2000 Server 中,单击“开始”,指向“程序”,单击“管理工具”,然后单击“服务”。
注意
在 Windows NT 4.0 版中,可以从“控制面板”中打开此对话框。
现在应该看到“MyNewService”列在窗口的“服务”区域中。
2.
从列表中选择您的服务,右击该服务,然后单击“启动”。
3.
右击该服务,再单击“停止”。
验证服务的事件日志输出
1.
打开“服务器资源管理器”并访问“事件日志”节点。有关更多信息,请参见如何:在服务器资源管理器中使用事件日志。
注意
Visual Studio 标准版中不提供“Windows 服务”模板及相关功能。有关更多信息,请参见 Visual Studio 版本。
2.
找到 MyNewLog 的列表并展开它。您应该看到服务所执行操作的项。
卸载服务
1.
在“开始”菜单上打开“控制面板”并单击“添加/删除程序”,再找到您的服务并单击“卸载”。
2.
还可以通过右击 .msi 文件的程序图标并选择“卸载”来卸载该程序。
注意
如果在 Windows 2000 上安装了服务,则需要重新启动系统才能重新安装服务。在 Windows 2000 中,服务在系统重新启动之前不会完全删除。
后续步骤
可以利用 ServiceController 组件将命令发送到已安装的服务。有关使用 ServiceController 控件的更多信息,请参见监视 Windows 服务。
可以在安装应用程序时使用安装程序创建事件日志,而不是在运行应用程序时创建事件日志。此外,在卸载应用程序时,事件日志将被安装程序删除。有关更多信息,请参见演练:安装事件日志组件。