有图形用户界面的Windows Service

内容目录

起因解决方案一、开发环境二、创建Windows Service三、创建Service控制窗体程序四、运行Service控制窗体程序总结

起因

在平时部署Windows Service时,通过命令行部署服务太费劲了,总想着有没有想桌面程序那样的方式,点个按钮就能完成所有操作的了。此想法由来已久,只是事情比较多,最近总算有时间了,在此想法的驱使下,最终有了这篇文章的诞生。

解决方案

一、开发环境

操作系统:Windows 10 X64
开发环境:VS2013
编程语言:C#
.NET版本:.NET Framework 4.0
目标平台:X86

二、创建Windows Service

1、新建一个Windows Service,并将项目名称改为“WindowsServiceDemo”,如下图所示:

2、重命名服务文件Service1.cs为ServideDemo.cs,弹出“重命名选择”提示框选择“是”。

3、选中服务文件ServiceDemo.cs,点击“查看代码”按钮,跳转至编辑代码页面。

4、在代码编辑也,编辑服务代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;

namespace WindowsServiceDemo
{
    public partial class ServiceDemo : ServiceBase
    {
        public ServiceDemo()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            // TODO:在此处添加代码以启动服务。
            ServiceLog(@"E:\ServiceDemoLog.txt", String.Format("{0},服务启动!", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
        }

        protected override void OnStop()
        {
            // TODO:在此处添加代码以执行停止服务所需的关闭操作。
            ServiceLog(@"E:\ServiceDemoLog.txt", String.Format("{0},服务停止!", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
        }

        private void ServiceLog(String path, String Context)
        {
            using (FileStream stream = new FileStream(path, FileMode.Append))
            using (StreamWriter writer = new StreamWriter(stream))
            {
                writer.WriteLine(Context);
            }
        }
    }
}

5、右键单击ServiceDemo.cs,单击“查看设计器”。在设计器上右键单击,点击“添加安装程序”。

6、程序安装文件ProjectInstaller.cs,包含一个“serviceProcessInstaller”和“serviceInstaller”组件。

7、serviceInstaller组件右键单击,选择“属性”。修改“ServiceName”为“ServiceDemo”,修改“Description”为“服务例子”;修改“StartType”为“Manual”。

8、serviceProcessInstaller组件单击,选择“属性”。修改“Account”为“LocalSystem”。

9、右键单击WindowsServiceDemo项目文件,选择“生成”。服务创建成功。

三、创建Service控制窗体程序

1、新建一个名为WindowsServiceDemoClient的Windows窗体程序。

2、设计窗体功能组件,如下图:

3、引入命名空间“System.ServiceProcess”和“System.Configuration.Install”,点击不同按钮实现按钮功能,代码如下

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Data;
using System.Drawing;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsServiceDomeClient
{
    public partial class Form1 : Form
    {
        private readonly String serviceFilePath = String.Format("{0}\\WindowsServiceDemo.exe", Application.StartupPath);
        private readonly String serviceName = "ServiceDemo";

        public Form1()
        {
            InitializeComponent();
            ServiceState();
        }

        private void btnInstaller_Click(object sender, EventArgs e)
        {
            if (IsServiceExisted(serviceName)) UninstallService(serviceName);
            InstallService(serviceFilePath);
            ServiceState();
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            if (IsServiceExisted(serviceName)) StartService(serviceName);
            ServiceState();
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            if (IsServiceExisted(serviceName)) StopService(serviceName);
            ServiceState();
        }

        private void btnUninstaller_Click(object sender, EventArgs e)
        {
            if (IsServiceExisted(serviceName))
            {
                StopService(serviceName);
                UninstallService(serviceFilePath);
            }
            ServiceState();
        }

        /// <summary>
        /// 设置当前服务状态
        /// </summary>
        private void ServiceState()
        {
            String state = "--";
            if (!IsServiceExisted(serviceName))
            {
                state = "服务未安装";
            }
            else
            {
                ServiceController service = new ServiceController(serviceName);
                switch (service.Status)
                {
                    case ServiceControllerStatus.ContinuePending:
                        break;
                    case ServiceControllerStatus.PausePending:
                        break;
                    case ServiceControllerStatus.Paused:
                        state = "服务已暂停";
                        break;
                    case ServiceControllerStatus.Running:
                        state = "服务已启动";
                        break;
                    case ServiceControllerStatus.StartPending:
                        break;
                    case ServiceControllerStatus.StopPending:
                        break;
                    case ServiceControllerStatus.Stopped:
                        state = "服务未启动";
                        break;
                    default:
                        break;
                }
            }
            lblServiceState.Text = state;
        }

        #region /-- 服务内部方法 --/

        /// <summary>
        /// 判断服务是否存在
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        private Boolean IsServiceExisted(String name)
        {
            ServiceController[] service = ServiceController.GetServices();
            foreach (var item in service)
            {
                if (item.ServiceName.ToLower() == serviceName.ToLower())
                {
                    return true;
                }
            }
            return false;
        }

        /// <summary>
        /// 安装服务
        /// </summary>
        /// <param name="serviceFilePath"></param>
        private void InstallService(String serviceFilePath)
        {
            using (AssemblyInstaller installer = new AssemblyInstaller())
            {
                installer.UseNewContext = true;
                installer.Path = serviceFilePath;
                IDictionary savedState = new Hashtable();
                installer.Install(savedState);
                installer.Commit(savedState);
            }
        }

        /// <summary>
        /// 卸载服务
        /// </summary>
        /// <param name="serviceFilePath"></param>
        private void UninstallService(String serviceFilePath)
        {
            using (AssemblyInstaller installer = new AssemblyInstaller())
            {
                installer.UseNewContext = true;
                installer.Path = serviceFilePath;
                installer.Uninstall(null);
            }
        }

        /// <summary>
        /// 启动服务
        /// </summary>
        /// <param name="serviceName"></param>
        private void StartService(String serviceName)
        {
            //using (ServiceController service = new ServiceController(serviceName)){
            //    if (service.Status == ServiceControllerStatus.Stopped) {
            //        service.Start();
            //    }
            //}
            ServiceController service = new ServiceController(serviceName);
            if (service.Status == ServiceControllerStatus.Stopped)
            {
                service.Start();
                service.WaitForStatus(ServiceControllerStatus.Running);
                service.Close();
            }
        }

        /// <summary>
        /// 停止服务
        /// </summary>
        /// <param name="ServiceName"></param>
        private void StopService(String serviceName)
        {
            //using(ServiceController service = new ServiceController(serviceName)){
            //    if(service.Status == ServiceControllerStatus.Running){
            //        service.Stop();
            //    }
            //}
            ServiceController service = new ServiceController(serviceName);
            if (service.Status == ServiceControllerStatus.Running)
            {
                service.Stop();
                service.WaitForStatus(ServiceControllerStatus.Stopped);
                service.Close();
            }
        }

        #endregion
    }
}

4、为了在Windows窗体程序中安装、卸载Windows服务,需要在Windows窗体程序中引入已经生成的WindowsServiceDemo服务。

5、安装Windows服务需要UAC中Administrator的权限,右键WindowsServiceDemoClient“添加”-“新建项”,添加“应用程序清单文件”,app.manifest文件。

6、修改为

7、右键单击WindowsServiceDemoClient项目文件,选择“生成”。操作服务客户端创建成功。

四、运行Service控制窗体程序

1、右键“WindowsServiceDemoClient”窗体程序“在文件资源管理器中打开文件夹”。

2、在“bin”-“Debug”中找到WindowsServiceDemoClient.exe双击打开。

3、在“开始”-“Windows系统”-“运行”,输入“services.msc”打开服务列表。

4、点击“安装服务”,服务安装成功,手动刷新服务列表,ServiceDemo显示出来。

5、点击“启动服务”,服务启动成功,手动刷新服务列表,ServiceDemo状态显示“正在运行”。

6、点击“停止服务”,服务停止成功,手动刷新服务列表,ServiceDemo状态置空了。

7、点击“卸载服务”,服务卸载成功,手动刷新服务列表,ServiceDemo不存在了。

8、以下为服务启动和停止时写入“E:\ServiceDemoLog.txt”中的日志信息。

总结

到此文章完成,也算了了一个小小的心愿,O(∩_∩)O哈哈~
以后继续加油吧,写更好的文章。拜拜~

原文地址:https://www.cnblogs.com/DeveloperHome/p/10453091.html

时间: 2024-11-25 20:55:35

有图形用户界面的Windows Service的相关文章

C#制作Windows service服务系列二:演示一个定期执行的windows服务及调试(windows service)

系列一: 制作一个可安装.可启动.可停止.可卸载的Windows service(downmoon原创) 系列二:演示一个定期执行的windows服务及调试(windows service)(downmoon) 系列三: windows service系列三--制作可控制界面的windows service 一.经常有人问起如何让程序定期自动执行? 除了像系统任务和SQL JOB/DTS等都可以满足不同的用户需求外,这里演示了如何做一个简单的windows serivce的框架.主要的功能是按照

C# 开发Windows Service程序控制功能

在做一些计划任务时候难免用到Windows Service服务程序,而这个是没有操作界面的,每次启动.重启.关闭都需要服务界面找到服务进行操作,对普通的人来说是非常麻烦的,所以有时候就需要通过应用程序来控制Windows 服务,这里把之前写到的一个服务控制类贴出来. C# Windows 服务控制类代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syste

WCF注册Windows Service

WCF注册Windows Service 2014-06-14 返回 在前面创建一个简单的WCF程序,我们把WCF的服务寄宿到了Host这个控制台项目中了.下面将介绍如何把WCF的服务寄宿到Windows服务中: 1. 删除原来Host控制台项目,然后在solution上右键,新建一个WindowService项目.如下图: 2.对MyFirstWindowsService项目添加对Contracts项目.Service项目和System.ServiceModel的引用. 3.将MyFristW

WebLogic 把应用域加到Windows service中

在Windows操作系统中,WebLogic即可以通过命令行启动,也可以通过Windows服务(Service)来启动和停止.在某些情况下,如需要开机自启动,或者在启动后,命令行窗口可以关闭,这时使用Window service便有优势. 一.如何将WebLogic Web应用部署成Windows服务呢? 1.在WebLogic安装目录下找到installSvc.cmd文件 一般在位置:[WebLogic安装目录]/Oracle/Middleware//server 下 2.修改installS

C# 编写Windows Service(windows服务程序)

Windows Service简介: 一个Windows服务程序是在Windows操作系统下能完成特定功能的可执行的应用程序.Windows服务程序虽然是可执行的,但是它不像一般的可执行文件通过双击就能开始运行了,它必须有特定的启动方式.这些启动方式包括了自动启动和手动启动两种.对于自动启动的Windows服务程序,它们在Windows启动或是重启之后用户登录之前就开始执行了.只要你将相应的Windows服务程序注册到服务控制管理器(Service Control Manager)中,并将其启动

C# Windows Service服务的创建和调试

前言 关于Windows服务创建和调试的文章在网络上的很多文章里面都有,直接拿过来贴在这里也不过仅仅是个记录,不会让人加深印象.所以本着能够更深刻了解服务项目的创建和调试过程及方法的目的,有了这篇记录. 目录 一.什么是Windows Service服务? 二.基于C#的Windows Service服务的创建.安装.卸载? 三.Windows Service服务开发过程中如何调试代码? 正文 一.什么是Windows Service服务? Microsoft Windows 服务(即,以前的

C# 编写Windows Service(windows服务程序)【转载】

[转]http://www.cnblogs.com/bluestorm/p/3510398.html Windows Service简介: 一个Windows服务程序是在Windows操作系统下能完成特定功能的可执行的应用程序.Windows服务程序虽然是可执行的,但是它不像一般的可执行文件通过双击就能开始运行了,它必须有特定的启动方式.这些启动方式包括了自动启动和手动启动两种.对于自动启动的Windows服务程序,它们在Windows启动或是重启之后用户登录之前就开始执行了.只要你将相应的Wi

windows Service 之调试过程(附加到进程里调试,而且启动时间不能超过30秒)

最近第一次用C#写了一个windows service ,其实实现的内容比较简单.就是启动remoting 连接,但是调试相对初次写windws service 的我来说,比较烦.没有经验,而且没办法像调试其他windows 程序一样设置断点,无法看到运行过程.经过查看一些相关资料后,有了一点点调试的心得.特此留笔,以待今后使用. 相关源码: static void Main()        {            ServiceBase[] ServicesToRun; // 同一进程中可

使用ASP.NET实现Windows Service定时执行任务

转载http://blog.csdn.net/yanghua_kobe/article/details/6937816 我们怎样才能在服务器上使用asp.net定时执行任务而不需要安装windows service?我们经常需要运行一些维护性的任务或者像发送提醒邮件给用户这样的定时任务.这些仅仅通过使用Windows Service就可以完成.Asp.net通常是一个无状态的提供程序,不支持持续运行代码或者定时执行某段代码.所以,我们不得不构建自己的windows service来运行那些定时任