Windows Service开发介绍

创建服务

1、选择新建->项目->Windows桌面,选择Windows服务。

2、输入名称,单击"确定"。
注意事项:如果在模板中没有Windws服务,可能是未安装.NET桌面开发,可以通过选择左下角打开Visual Studio选择安装程序,选择.NET桌面开发安装。

重命名服务

1、服务创建好,默认名称是Service1.cs,根本实际业务改为匹配的名称,修改名称过程中,会提示"即将重命名文件。是否也对此项目中对代码元素“Service1”的所有引用执行重命名操作?",点击"是"。

2、双击服务,在"设计"视图中,右击"属性",在属性窗口中把ServiceName的值更改为刚才修改的名字。

编写业务

在"设计"视图中,点击"切换到代码视图",可以看到,此类继承了ServiceBase
代码默认重写有OnStart和OnStop两个方法,用于启动和停止服务对组件的处理。

        /// <summary>
        /// 启动
        /// </summary>
        /// <param name="args"></param>
        protected override void OnStart(string[] args)
        {
            Log4netHelper.Info("Demo Service启动");
            // TODO 业务处理
        }

        /// <summary>
        /// 停止
        /// </summary>
        protected override void OnStop()
        {
            Log4netHelper.Info("Demo Service停止");
        }

还可以重写 OnPause、OnContinue 和 OnShutdown 方法来定义对组件的其他处理。
支持通过EventLog写入事件日志,需要在"serviceProcessInstaller1"中的Account设置为LocalSystem。
注意事项:不推荐使用此帐户,因为权限过大,推荐使用LocalSerice帐户。

轮询

通过Timer组件来实现此功能。
示例:

        /// <summary>
        /// 启动
        /// </summary>
        /// <param name="args"></param>
        protected override void OnStart(string[] args)
        {
            Log4netHelper.Info("Demo Service启动");
            Timer timer = new Timer();
            timer.Interval = 60000; // 60 秒
            timer.Elapsed += new ElapsedEventHandler(this.OnTimer);
            timer.Start();
        }

        /// <summary>
        /// 定时器事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        public void OnTimer(object sender, ElapsedEventArgs args)
        {
            // TODO 业务处理
            Log4netHelper.Info("Timer执行");
        }

添加安装程序

1、添加安装程序

双击服务名称,在"设计"视图中右击,选择添加安装程序。

Visual Studio会向项目中添加一个名为ProjectInstaller组件,其中会包含两个安装程序。

2、配置安装程序

在ProjectInstaller的"设计"视图中,选择"serviceProcessInstaller1",右击选择属性,配置参数:

  1. Account设置为LocalService。

在ProjectInstaller的"设计"视图中,选择"serviceInstaller1",右击选择属性,配置参数:

  1. Account设置为LocalService。
  2. Description设置服务描述,此描述在"服务"窗口描述列显示。
  3. DisplayName设置为Demo服务,此名称可以不同于ServiceName属性,它是系统使用的名称,此名称在"服务"窗口名称列显示。
  4. ServiceName设置为DemoService,和服务类名称保持一致。
  5. StartType设置为Automatic,自启动。

3、添加自启动程序

  在StartType设置为Automatic,并不能达到程序安装后启动,需要在`ProjectInstaller.cs`中增加代码。
       /// <summary>
        /// Ctor
        /// </summary>
        public ProjectInstaller()
        {
            InitializeComponent();
            // 安装后自启动
            this.Committed += new InstallEventHandler(ProjectInstaller_Committed);
        }

        /// <summary>
        /// 安装后发生事件,启动服务
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ProjectInstaller_Committed(object sender, InstallEventArgs e)
        {
            System.ServiceProcess.ServiceController controller = new System.ServiceProcess.ServiceController("DemoService");
            controller.Start();
        }

注意事项:ServiceController构造函数接收向系统标识该服务的名称, 也可以是服务的显示名称。

安装服务

使用InstallUtil.exe安装,启用Cmd或Windows PowerShell输入安装命令。
注意事项:Cmd或Windows PowerShell必须使用管理员模式打开。

1、安装

  1. 32位.NET Framework4或4.5以及更高版本。
    安装:

    C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe 文件所在完整路径\DemoService.exe
    

    卸载:

    C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /u 文件所在完整路径\DemoService.exe
    
  2. 64位.NET Framework4或4.5以及更高版本。
    安装:

    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe 文件所在完整路径\DemoService.exe
    

    卸载:

    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /u 文件所在完整路径\DemoService.exe
    

2、效果

调试

由于服务的特殊性,无法直接启动调试,可以通过附加进行的方式进行调整。

1、附加进程

通过Visual Studio"调试"选择"附加到进程"。

2、选择服务进程

在进程中找到对应的服务。

3、效果


注意事项:
1、附加进程调试,Visual Studio必须以管理员权限打开。
2、如果在附加进程中看不到服务,确认"显示所有用户的进程"是否已勾选。
3、服务正常运行时,程序重新编译会失败,必须停止服务才能编译。

posted @ 2020-10-23 17:05  TC-MrLee  阅读(339)  评论(0编辑  收藏  举报