演练:在组件设计器中创建 Windows 服务应用程序

提示

Visual Studio 标准版中不提供“Windows 服务”模板及相关功能。

本主题中的步骤演示如何创建一个简单的 Windows 服务应用程序,以便向事件日志中写入消息。 创建和使用服务所执行的基本步骤包括:

  • 使用**“Windows 服务”**应用程序模板创建项目。 此模板为您创建一个从 ServiceBase 继承的类,并编写大量基本服务代码,例如启动服务的代码。

  • 编写 OnStartOnStop 过程的代码,并重写要重新定义的任何其他方法。

  • 添加服务应用程序所必需的安装程序。 默认情况下,当单击**“添加安装程序”**链接时,会将一个包含两个或多个安装程序的类添加到应用程序中:一个程序用于安装进程,其他每个安装程序用于项目包含的每个关联服务。

  • 生成您的项目。

  • 创建安装项目以安装服务,然后进行安装。

  • 访问 Windows 2000 服务控制管理器并启动您的服务。

首先,创建项目并设置服务正常运行所必需的值。

提示

对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您所使用的 Visual Studio 版本和您所使用的设置。有关更多信息,请参见 Visual Studio 设置

创建服务

创建并配置服务

  1. 在**“文件”菜单上,单击“新建项目”**。

    将打开**“新建项目”**对话框。

  2. 在 Visual Basic 或 Visual C# 项目模板的列表中选择**“Windows 服务”,并将项目命名为 MyNewService。 单击“确定”**。

    提示

    项目模板自动添加从 System.ServiceProcess.ServiceBase 继承的名为 Service1 的组件类。

  3. 单击设计器选择 Service1。 然后,在**“属性”窗口中,将 Service1 的 ServiceName“(名称)”**属性设置为 MyNewService。

向服务添加功能

在下一节中,将自定义事件日志添加到 Windows 服务中。 事件日志与 Windows 服务没有任何形式的关联。 此处,EventLog 组件用作可以添加到 Windows 服务的组件类型的示例。

将自定义事件日志功能添加到服务中

  1. 在**“解决方案资源管理器”中,右击“Service1.vb”“Service1.cs”,并选择“视图设计器”**。

  2. 从**“工具箱”“组件”**选项卡,将 EventLog 组件拖到设计器中。

  3. 在**“解决方案资源管理器”中,右击“Service1.vb”“Service1.cs”,并选择“查看代码”**。

  4. 添加或编辑构造函数以定义一个自定义事件日志。

    ' 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 方法,然后编写代码来确定当服务开始运行时发生的情况:

    ' 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 过程,该过程在创建项目时已自动重写。 编写代码以确定服务停止时发生的情况:

    Protected Overrides Sub OnStop()
      EventLog1.WriteEntry("In OnStop.")
    End Sub
    
        protected override void OnStop()
        {
            eventLog1.WriteEntry("In onStop.");
        }
    

还可以重写 OnPauseOnContinueOnShutdown 方法来定义对组件的其他处理。

定义服务的其他操作

  • 对于要处理的方法,重写适当的方法并定义要发生的情况。

    下面的代码显示重写 OnContinue 方法时代码的情况:

    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”,并选择“视图设计器”**。

  2. 单击设计器的背景以选择服务本身,而不是它的任何内容。

  3. 设计器具有焦点时,右击然后单击**“添加安装程序”**。

    默认情况下,向您的项目添加一个包含两个安装程序的组件类。 将该组件命名为 ProjectInstaller,它包含的安装程序分别是服务的安装程序和服务关联进程的安装程序。

  4. 在**“ProjectInstaller”“设计”视图中,单击“ServiceInstaller1”“serviceInstaller1”**。

  5. 在**“属性”**窗口中,确保 ServiceName 属性已设置为 MyNewService。

  6. StartType 属性设置为 Automatic

  7. 在设计器中单击**“ServiceProcessInstaller1”(对于 Visual Basic 项目)或“serviceProcessInstaller1”**(对于 Visual C# 项目)。 将 Account 属性设置为 LocalSystem。 这将使得在本地服务帐户上安装和运行该服务。

    安全说明安全说明

    LocalSystem 帐户具有广泛的权限,包括能够写入事件日志。 使用此帐户时要特别小心,因为它会增加您受到恶意软件攻击的风险。 对于其他任务,请考虑使用 LocalService 帐户,该帐户用作本地计算机上的非特权用户,并向任意远程服务器提供匿名凭据。

生成服务项目

  1. 在**“解决方案资源管理器”中,右击您的项目,然后单击“属性”。 出现项目的“属性设计器”**。

  2. 在“应用程序”页上的**“启动对象”列表中,单击“MyNewService”**。

  3. 按 Ctrl+Shift+B 生成项目。

生成项目后,便可以对其进行部署了。 安装项目将安装已编译的项目文件并运行要运行 Windows 服务所需的安装程序。 若要创建完整的安装项目,您必须将项目输出**“MyNewService.exe”添加到安装项目,然后添加自定义操作来安装“MyNewService.exe”**。 有关安装项目的更多信息,请参见安装和部署项目。 有关自定义操作的更多信息,请参见演练:创建自定义操作

为服务创建安装项目

  1. 在**“解决方案资源管理器”中,右击解决方案,指向“添加”,然后单击“新建项目”**。

  2. 在**“已安装的模板”下,展开“其他项目类型”,然后展开“安装和部署”**。

  3. 选择**“Visual Studio Installer”**。

  4. 在**“模板”窗格中选择“安装项目”。 将项目命名为 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 7、Windows Vista 和 Windows Server 中打开服务控制管理器,请右击**“开始”菜单中的“计算机”,然后单击“管理”。 在“计算机管理”控制台中,在左窗格中展开“服务和应用程序”节点。 单击“服务”**。

    现在应该看到**“MyNewService”列在窗口的“服务”**区域中。

  2. 从列表中选择您的服务,右击该服务,然后单击**“启动”**。

  3. 右击该服务,再单击**“停止”**。

验证服务的事件日志输出

  1. 打开**“服务器资源管理器”并访问“事件日志”**节点。

    提示

    Visual Studio 标准版中不提供“Windows 服务”模板及相关功能。

  2. 找到 MyNewLog 的列表并展开它。 您应该看到服务所执行操作的项。

卸载服务

  • 在**“开始”菜单上打开“控制面板”并单击“添加或删除程序”,然后找到您的服务并单击“卸载”**。

后续步骤

可以利用 ServiceController 组件将命令发送到已安装的服务。

可以在安装应用程序时使用安装程序创建事件日志,而不是在运行应用程序时创建事件日志。 此外,在卸载应用程序时,事件日志将被安装程序删除。

请参见

任务

如何:将安装程序添加到服务应用程序

如何:安装和卸载服务

如何:调试 Windows 服务应用程序

参考

如何:访问和初始化服务器资源管理器/数据库资源管理器

概念

Windows 服务应用程序介绍

其他资源

Windows 服务应用程序