C#操作Windows服务类System.ServiceProcess.ServiceBase

一、Windows服务

1、Windows服务应用程序是一种需要长期运行的应用程序,它适合服务器环境。

2、无用户界面,任何消息都会写进Windows事件日志。

3、随计算机启动而启动,不需要用户一定登录Windows。

4、通过服务控制管理器,可以终止、暂停及当需要时启动Windows服务。

二、体系结构

System.ServiceProcess命令空间

1、类继承关系:

  • Object

    • Component

      • ServiceBase
      • ServiceController
      • Installer
        • ComponentInstaller
        • ServiceInstaller
        • ServiceProcessInstaller

2、体系结构

第一部分就是服务程序。实现系统的业务需求。

Service Control Manager(SCM)。SCM是操作系统的一个组成部分(services.exe),作用是于服务进行通信。
SCM包含一个储存着已安装的服务和驱动程序的信息的数据库,通过SCM可以统一的、安全的管理这些信息。
一个服务拥有能从SCM收到信号和命令所必需的的特殊代码,并且能够在处理后将它的状态回传给SCM。

ServiceBase:(服务程序)实现系统的业务需求。 在创建新的服务类时,必须从 ServiceBase 派生。

第二部分服务控制程序,是一个Service Control Dispatcher(SCP)。
它是一个拥有用户界面,允许用户开始、停止、暂停、继续,并且控制一个或多个安装在计算机上服务的Win32应用程序。
SCP的作用是与SCM通讯,Windows 管理工具中的“服务”就是一个典型的SCP。

ServiceController:(服务控制程序)表示 Windows 服务并允许连接到正在运行或者已停止的服务、对其进行操作或获取有关它的信息。

第三部分、服务配置程序配置程序可以安装服务,向注册表注册服务,设置服务的启动类型、服务的用户及依存关系等。

ServiceInstaller:(服务安装配置程序)继承自Installer类。该类扩展 ServiceBase 来实现服务。 在安装服务应用程序时由安装实用工具调用该类。

ServiceProcessInstaller :(服务安装配置程序)继承自Installer类。安装一个可执行文件,该文件包含扩展 ServiceBase 的类。 该类由安装实用工具(如 InstallUtil.exe)在安装服务应用程序时调用。

三、创建Windows服务:ServiceBase

新建一个“Windows服务”项目,添加一个System.Timers.Timer组件。

1)单个服务

static void Main()
{
    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[]
    {
        new  MyService1()
    };
    ServiceBase.Run(ServicesToRun);
}

服务程序:

public partial class MyService1 : ServiceBase
{
    public MyService1()
    {
        InitializeComponent();
        myTimer = new System.Timers.Timer();
        myTimer.Interval = 60000; //设置计时器事件间隔执行时间
        myTimer.Elapsed += (timer1_Elapsed);
        this.ServiceName = "我的服务";
        this.AutoLog = true;//是否自行写入系统的事件日志
        this.CanHandlePowerEvent = true;//是否接受电源事件
        this.CanPauseAndContinue = true;//是否能暂停或继续
        this.CanShutdown = true;//是否在计算机关闭时收到通知
        this.CanStop = true;//是否接受停止运行的请求
    }

    private void timer1_Elapsed(object sender, ElapsedEventArgs e)
    {
        File.AppendAllText("C:\\1.txt", "Service Runing");
    }

    string filePath = @"D:\MyServiceLog.txt";

    protected override void OnStart(string[] args)
    {
        this.timer1.Enabled = true;
        File.AppendAllText("C:\\1.txt", "Service Started");
    }

    protected override void OnStop()
    {
        this.timer1.Enabled = false;
        File.AppendAllText("C:\\1.txt", "Service Stoped");
    }
}

服务在运行时,获取其可执行文件的父目录:
AppDomain.CurrentDomain.BaseDirectory;

2)多个服务

static void Main()
{
    ServiceBase[] ServicesToRun;

    string Line = Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory).Name;

    DCWinService lineService = new DCWinService(Line);
    lineService.ServiceName = "GPE.PAMSDC.DCService(" + Line + ")";

    ServicesToRun = new ServiceBase[] { lineService };
    ServiceBase.Run(ServicesToRun);
}

服务程序:

public partial class DCWinService : ServiceBase
{
    public DCWinService()
    {
        InitializeComponent();
    }
    string line;

    public DCWinService(string line)
    {
        this.line = line;
    }
    protected override void OnStart(string[] args)
    {
        // TODO: 在此处添加代码以启动服务。
        GPE.PAMSDC.DCServer.Start(line);//动态加载
    }

    protected override void OnStop()
    {
        // TODO: 在此处添加代码以执行停止服务所需的关闭操作。
        GPE.PAMSDC.DCServer.Stop(line);
    }
}

四、添加服务安装程序:(与服务程序同一项目)

创建一个Windows服务,仅用InstallUtil程序去安装这个服务是不够的。你必须还要把一个服务安装程序添加到你的Windows服务当中,这样便于InstallUtil或是任何别的安装程序知道应用你服务的是怎样的
配置设置。

在服务程序的设计视图右击“添加安装程序”,自动添加一个ProjectInstaller文件“DCServiceInstaller”。

在ProjectInstaller的设计视图中,分别设置serviceInstaller1组件和serviceProcessInstaller1的属性。

1)单个服务:

// serviceInstaller1
this.serviceInstaller1.Description = "消息发送服务.";
this.serviceInstaller1.DisplayName = "MyService1";
this.serviceInstaller1.ServiceName = "MyService1";//要与前面的定义的服务名一致。
this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic;

// serviceProcessInstaller1
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
this.serviceProcessInstaller1.Password = null;
this.serviceProcessInstaller1.Username = null;

// DCServiceInstaller
this.Installers.AddRange(new System.Configuration.Install.Installer[] {
this.serviceInstaller1,
this.serviceProcessInstaller1});

2)多个服务:

string[] lines = new string[] { "T1", "T2" };
ServiceInstaller serviceInstaller1;

foreach (string line in lines)
{
    // serviceInstaller1
    serviceInstaller1 = new ServiceInstaller();
    serviceInstaller1.Description = "消息发送服务.";
    serviceInstaller1.DisplayName = "GPE.PAMSDC.DCService(" + line + ")";
    serviceInstaller1.ServiceName = "GPE.PAMSDC.DCService(" + line + ")";
    this.Installer.Add(this.serviceInstaller1);//serviceInstaller可以有多个

}
// serviceProcessInstaller1
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
// DCServiceInstaller
this.Installers.Add(this.serviceProcessInstaller1);//serviceProcessInstaller只能有一个

注意:在服务安装程序中,获取可执行文件的父目录:

Directory.CreateDirectory("./").Name

五、Windows服务的安装程序

1、创建一个“安装部署”的项目,右键项目名称,选择“添加”-“项目输出”,选择前面创建的服务项目,再选择“主输出”。也可以右击安装项目,“视图”,“添加自定义操作”。

2、使用InstallUtil.exe工具,批处理文件为:

  • 安装:

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe ./GPE.PAMSDC.DCService.exe
Net Start DCService
sc config DCServicestart= auto

  • 卸载:

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe -u ./GPE.PAMSDC.DCService.exe

通过第三方组件 (Topshelf)创建C# Windows服务应用程序。

六、服务控制程序:ServiceController

List<ServiceController> services = new List<ServiceController>(ServiceController.GetServices());
services = services.FindAll(s => s.DisplayName.StartsWith("GPE.PAMSDC.DCService"));
services.Sort((s1, s2) => s1.DisplayName.CompareTo(s2.DisplayName));

List<ServiceControllerInfo> serviceInfo = services.ConvertAll(s => new ServiceControllerInfo(s));
foreach (ServiceControllerInfo si in serviceInfo)
{
    if (si.EnableStart)
    {
        si.Controller.Start();
        si.Controller.WaitForStatus(ServiceControllerStatus.Running);
    }
}

七、调试Windows服务

必须首先启动服务,然后将一个调试器附加到正在运行的服务的进程中。

1、用VS加载这个服务项目。

2、“调试”菜单,“附加到进程”。

3、确保“显示所有用户进行”被选择。

4、在“可用进程”列表中,选中你的可执行文件的名称。

5、点击“附加”按钮。

6、在timer_Elapsed方法中设置断点,然后执行,从而实现调试的目的。

到此这篇关于C#操作Windows服务类System.ServiceProcess.ServiceBase的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#创建控制Windows服务

    需求 针对一种特殊的应用, 不需要显示GUI, 希望常驻在Windows服务当中,在必要的时候我们可以进行启动或开机启动. 这个时候我们就可以创建WindowsService 来实现. 创建WindowsService 下面演示了使用VisualStudio2019创建一个基于.NetFramework的Windows服务 项目结构如下所示: 包含了一个启动项以及一个服务类 右键查看 Service1代码, 如下所示, 包含了重写OnStart方法以及OnStop方法: public parti

  • c#创建windows服务入门教程实例

    用c#中创建一个windows服务非常简单,与windows服务相关的类都在System.ServiceProcess命名空间下. 每个服务都需要继承自ServiceBase类,并重写相应的启动.暂停.停止等方法. windows服务的相关信息是存放与注册表中的,所以他可以在不需要用户登录的情况下自动运行,在c#中你不需要再直接向注册表中添加信息了,c#提供了服务安装类 ServiceProcessInstaller和ServiceInstaller来实现服务的安装. 首先,用vs创建一个win

  • C#创建Windows服务的实现方法

    Microsoft Windows 服务能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这使服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用.还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务. 一.创建Windows 服务 1.新建一个Windows 服务,并将项目名称改为"WindowsServiceDemo

  • C#编写Windows服务实例代码

    Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这使服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用.还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务. 使用Microsoft Visual Studio2012可以很方便的创建一个Windo

  • C#实现操作windows系统服务(service)的方法

    本文实例讲述了C#实现操作windows系统服务(service)的方法.分享给大家供大家参考.具体如下: 这段C#代码可以控制启动和停止系统服务 /// <summary> /// 停止服务 /// </summary> private bool StopService(string StopServiceName) { ServiceController service = new ServiceController(StopServiceName); try { servic

  • C#创建Windows服务与服务的安装、卸载

    Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这种服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用.还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务. 一.使用C#创建Windows service步骤: 1.文件->新建->项目:选择Windows服务,修

  • c#创建windows服务(Windows Services)详细步骤

    Windows服务在Visual Studio 以前的版本中叫NT服务,在VS.net启用了新的名称.用Visual C# 创建Windows服务不是一件困难的事,本文就将指导你一步一步创建一个Windows服务并使用它.这个服务在启动和停止时,向一个文本文件中写入一些文字信息. 第一步:创建服务框架 要创建一个新的 Windows 服务,可以从Visual C# 工程中选取 Windows 服务(Windows Service)选项,给工程一个新文件名,然后点击 确定.你可以看到,向导向工程文

  • C#对Windows服务组的启动与停止操作

    Windows服务大家都不陌生,Windows服务组的概念,貌似MS并没有这个说法. 作为一名软件开发者,我们的机器上安装有各种开发工具,伴随着各种相关服务. Visual Studio可以不打开,SqlServer Management Studio可以不打开,但是SqlServer服务却默认开启了.下班后,我的计算机想用于生活.娱乐,不需要数据库服务这些东西,尤其是在安装了Oracle数据库后,我感觉机器吃力的很. 每次开机后去依次关闭服务,或者设置手动开启模式,每次工作使用时依次去开启服务

  • C#实现Windows服务测试与调试

    一.测试Windows服务 为了使Windows服务程序能够正常运行,我们需要像创建一般应用程序那样为它创建一个程序的入口点.像其他应用程序一样,Windows服务也是在Program.cs的Main()函数中完成这个操作.首先我们在Main()函数中创建一个Windows服务的实例,该实例应该是ServiceBase类的某个子类的对象,然后我们调用由基类ServiceBase类定义的一个Run()方法.然而调用Run()方法并不意味着就开始了Windows服务程序,必须要等到该对象的OnSta

  • C#使用windows服务开启应用程序的方法

    本文实例讲述了C#使用windows服务开启应用程序的方法.分享给大家供大家参考.具体如下: 使用windows服务开启应用程序,会遇到如下问题 1.使用windows服务开启的应用程序不会显示应用程序界面 解决方法:当安装服务之后,选中服务,点击属性->登录,然后设置登录身份为本地系统账户,并允许服务与桌面进行交互 2.使用的是远程桌面进行查看,不会显示界面 解决方法:不能直接使用mstsc命令进入远程桌面,要使用mstsc /v:192.168.1.10 /admin命令 ,这里192.16

随机推荐