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 服务。

可以在安装应用程序时使用安装程序创建事件日志,而不是在运行应用程序时创建事件日志。此外,在卸载应用程序时,事件日志将被安装程序删除。有关更多信息,请参见演练:安装事件日志组件。

C#2.0 编写window服务相关推荐

  1. 用C/C++编写window服务

    2019独角兽企业重金招聘Python工程师标准>>> Windows 服务被设计用于需要在后台运行的应用程序以及实现没有用户交互的任务.为了学习这种控制台应用程序的基础知识,C(不 ...

  2. 接Window服务(二)

    接Window服务(一) ServiceController方法调用 1 public partial class Service1 : ServiceBase 2 { 3 public Servic ...

  3. window 服务(二)

    window 服务(二) 接Window服务(一) ServiceController方法调用 public partial class Service1 : ServiceBase { public ...

  4. c++编写web服务_让我们编写一个文档样式的Web服务

    c++编写web服务 您可能知道,我们可以使用四种主要的Web服务样式. 它们如下: 文件/文学 包装的文件/文学 RPC /编码 RPC /文字 当然,现在不建议使用RPC /编码样式. 如果您有兴 ...

  5. 使用CXF框架Jax-rs规范编写WebService服务端

    前提是项目SSM框架搭建好. 搭建cxf框架, 一.首先,将框架所需要的jar导入,pom.xml文件中 <!-- cxf 进行rs开发 必须导入 --> <dependency&g ...

  6. 联发科heli p90_“如果您是Java开发人员并且正在编写微服务,那么Helidon是一个不错的选择”

    联发科heli p90 " Helidon仅设计用于微服务" 尽管Oracle最近开放了 Helidon(一组Java库)的开源资源 ,但是该项目本身并不新鲜,正如Helidon项 ...

  7. 内网穿透-利用frp进行远程桌面控制(window服务端,window客户端)

    内网穿透-利用frp进行远程桌面控制(window服务端,window客户端) 参考链接 https://blog.csdn.net/weixin_38416696/article/details/1 ...

  8. 用 .Net Framework 4.0 制作的安装程序来安装 .Net Framework 4.0 编写的程序

    文章题目看起来有点绕,解释一下,假如你基于框架写了一个程序,想装到客户机上,但是客户机上可能并没有安装框架,因此你的程序需要预先将框架安装在目标机上,然后再执行一些安装程序的标准功能,如创建快捷方式. ...

  9. 用VC++6.0编写拨号程序 作者:陈晓东 (转)

    用VC++6.0编写拨号程序 作者:陈晓东 (转)[@more@]用VC++6.0编写拨号 程序 作者:陈晓东 发布时间:2001/05/22   文章摘要: 本文利用visual c++6.0给出了 ...

最新文章

  1. 如何在TFS中用命令行提交更新
  2. Nginx模块之———— RTMP 模块的在线统计功能 stat 数据流数据的获取(不同节点则获取的方式不同)...
  3. Asp.Net中虚拟文件系统的使用
  4. 3行Python代码采集B站(弹幕、评论、用户)数据
  5. mysql2008无法登陆_SQL2008不能登录实例
  6. DSP5509项目之用FFT识别钢琴音调(5)之开始傅里叶变换
  7. 如何从javascript检索GET参数? [重复]
  8. leetcode-二叉树中的最大路径和
  9. 论WMS系统的未来前景
  10. usb摄像头android录像软件,USB摄像头app
  11. hive sql union all的性能优化
  12. 程序员,停止你的焦虑
  13. Love Your Life》—— 热爱生活
  14. 1.IEC 62056-21 E模式通信
  15. Fortran基础编程(3)——格式化输出
  16. linux开机自启动的几种方法
  17. 被问离职原因时哪类原因最好不要说?
  18. fcntl.py模块
  19. 传奇服务器都有哪些文件,传奇服务端目录文件详细说明
  20. Sql server 2016数据库卸载

热门文章

  1. 微信公众号文章增加评论功能
  2. 【无标题】翻译数字孪生经典文章Shaping the digital twin for design and production engineering
  3. 线上卖小龙虾怎么引流?微信上卖小龙虾如何引流?
  4. GNSS的基础知识 (GPS定位原理和组成)(1)
  5. 用Python分析深圳在售二手房数据,看看买房需要多少预算
  6. sql server高级查询及更新操作二
  7. “操作必须使用一个可更新的查询”故障解决
  8. 并购潮背后 英特尔能否跨域移动成为AI芯片老大
  9. 关于android性能,内存优化 http://www.cnblogs.com/zyw-205520/archive/2013/02/17/2914190.html
  10. NET 数据结构-单链表