我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C#创建控制Windows服务

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C#创建控制Windows服务

需求

针对一种特殊的应用, 不需要显示GUI, 希望常驻在Windows服务当中,在必要的时候我们可以进行启动或开机启动。

这个时候我们就可以创建WindowsService 来实现。

创建WindowsService

下面演示了使用VisualStudio2019创建一个基于.NetFramework的Windows服务

项目结构如下所示:

包含了一个启动项以及一个服务类

右键查看 Service1代码, 如下所示, 包含了重写OnStart方法以及OnStop方法:

     public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
        }

        protected override void OnStop()
        {
        }
    }

当服务被启动, 即启动OnStart方法内执行的代码, 而在ServiceBase当中, 同样提供了多种类型的方法被重写。

当我们写完了该服务的执行代码之后, 下一步我们要为其添加一个安装程序。

双击Service1.cs, 然后右键添加安装程序,如下所示:

此时, 项目结构当中新增了一个默认名:ProjectInstaller.cs类, 而对应的设计页面如下所示:

serviceProcessInstaller1:

查看该类的属性,如下所示:

说明:

Account: 默认设置为User, 当 Account 属性为时 User , Username 和 Password 属性用于定义用于运行服务应用程序的帐户。

Username和 Password 对允许服务在除系统帐户之外的其他帐户下运行。 例如,如果没有用户登录,则可以允许服务在重新启动时自动启动。 如果保留 Username 或 Password 为空,并且将设置 Account 为 User ,则在安装时系统将提示您输入有效的用户名和密码。

还可以指定服务在本地系统帐户下运行,或以本地或网络服务运行。 ServiceAccount有关帐户类型的详细信息,请参阅枚举:

serviceInstaller1:

查看该类的属性,如下所示:

注: 该类扩展 ServiceBase 来实现服务。 在安装服务应用程序时由安装实用工具调用该类。

说明:

  • DelayedAutoStart : 若要延迟该服务的自动启动,则为 true;否则为 false。 默认值为 false。
  • Description : 服务的说明。 默认值为空字符串("")。
  • DisplayName : 与服务关联的名称,常用于交互工具。
  • ServiceName: 要安装的服务的名称。 该值必须在安装实用工具尝试安装服务以前进行设置。
  • ServicesDependedOn : 在与该安装程序关联的服务运行以前必须运行的一组服务。
  • StartType : 表示服务的启动方式。 默认值为 Manual,指定在计算机重新启动后服务将不会自动启动。

控制WindowsService

创建完成服务之后, 接下来就是针对服务进行控制, 现在,可以使用 ServiceController 类来连接和控制现有服务的行为。

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

通过ServiceController,我们可以获取本机的Service服务,以及启动、暂停、延续、挂起、关闭、刷新等动作, 如下所示:

下面的示例演示如何使用 ServiceController 类来控制 Service1 服务示例。

using System;
using System.ServiceProcess;
using System.Diagnostics;
using System.Threading;

namespace ServiceControllerSample
{
    class Program
    {
        public enum SimpleServiceCustomCommands
        { StopWorker = 128, RestartWorker, CheckWorker };
        static void Main(string[] args)
        {
            ServiceController[] scServices;
            scServices = ServiceController.GetServices();

            foreach (ServiceController scTemp in scServices)
            {

                if (scTemp.ServiceName == "Service1")
                {
                    // Display properties for the Simple Service sample
                    // from the ServiceBase example.
                    ServiceController sc = new ServiceController("Simple Service");
                    Console.WriteLine("Status = " + sc.Status);
                    Console.WriteLine("Can Pause and Continue = " + sc.CanPauseAndContinue);
                    Console.WriteLine("Can ShutDown = " + sc.CanShutdown);
                    Console.WriteLine("Can Stop = " + sc.CanStop);
                    if (sc.Status == ServiceControllerStatus.Stopped)
                    {
                        sc.Start();
                        while (sc.Status == ServiceControllerStatus.Stopped)
                        {
                            Thread.Sleep(1000);
                            sc.Refresh();
                        }
                    }
                    // Issue custom commands to the service
                    // enum SimpleServiceCustomCommands
                    //    { StopWorker = 128, RestartWorker, CheckWorker };
                    sc.ExecuteCommand((int)SimpleServiceCustomCommands.StopWorker);
                    sc.ExecuteCommand((int)SimpleServiceCustomCommands.RestartWorker);
                    sc.Pause();
                    while (sc.Status != ServiceControllerStatus.Paused)
                    {
                        Thread.Sleep(1000);
                        sc.Refresh();
                    }
                    Console.WriteLine("Status = " + sc.Status);
                    sc.Continue();
                    while (sc.Status == ServiceControllerStatus.Paused)
                    {
                        Thread.Sleep(1000);
                        sc.Refresh();
                    }
                    Console.WriteLine("Status = " + sc.Status);
                    sc.Stop();
                    while (sc.Status != ServiceControllerStatus.Stopped)
                    {
                        Thread.Sleep(1000);
                        sc.Refresh();
                    }
                    Console.WriteLine("Status = " + sc.Status);
                    String[] argArray = new string[] { "ServiceController arg1", "ServiceController arg2" };
                    sc.Start(argArray);
                    while (sc.Status == ServiceControllerStatus.Stopped)
                    {
                        Thread.Sleep(1000);
                        sc.Refresh();
                    }
                    Console.WriteLine("Status = " + sc.Status);
                    // Display the event log entries for the custom commands
                    // and the start arguments.
                    EventLog el = new EventLog("Application");
                    EventLogEntryCollection elec = el.Entries;
                    foreach (EventLogEntry ele in elec)
                    {
                        if (ele.Source.IndexOf("Service1.OnCustomCommand") >= 0 |
                            ele.Source.IndexOf("Service1.Arguments") >= 0)
                            Console.WriteLine(ele.Message);
                    }
                }
            }
        }
    }
}
//This sample displays the following output if the Simple Service
//sample is running:
//Status = Running
//Can Pause and Continue = True
//Can ShutDown = True
//Can Stop = True
//Status = Paused
//Status = Running
//Status = Stopped
//Status = Running
//4:14:49 PM - Custom command received: 128
//4:14:49 PM - Custom command received: 129
//ServiceController arg1
//ServiceController arg2

安装WindowsService

能够控制我们创建的服务的前提是, 该服务已安装在我们调试的设备上, 我们可以通过AssemblyInstaller 类来进行安装。

安装示例

在下面的示例中, AssemblyInstaller 通过调用 AssemblyInstaller 构造函数来创建。 设置此对象的属性,并 Install Commit 调用和方法以安装 MyAssembly.exe 程序集。

using System;
using System.Configuration.Install;
using System.Collections;
using System.Collections.Specialized;

class AssemblyInstaller_Example
{
   static void Main()
   {
      IDictionary mySavedState = new Hashtable();

      Console.WriteLine( "" );

      try
      {
         // Set the commandline argument array for 'logfile'.
         string[] commandLineOptions = new string[ 1 ] {"/LogFile=example.log"};

         // Create an object of the 'AssemblyInstaller' class.
         AssemblyInstaller myAssemblyInstaller = new
                     AssemblyInstaller( "MyAssembly.exe" , commandLineOptions );

         myAssemblyInstaller.UseNewContext = true;

         // Install the 'MyAssembly' assembly.
         myAssemblyInstaller.Install( mySavedState );

         // Commit the 'MyAssembly' assembly.
         myAssemblyInstaller.Commit( mySavedState );
      }
      catch (Exception e)
      {
         Console.WriteLine( e.Message );
      }
   }
}

卸载示例

下面的示例演示的 Uninstall 方法 Installer 。 Uninstall方法在的派生类中被重写 Installer 。

// Override 'Uninstall' method of Installer class.
public override void Uninstall( IDictionary mySavedState )
{
   if (mySavedState == null)
   {
      Console.WriteLine("Uninstallation Error !");
   }
   else
   {
      base.Uninstall( mySavedState );
      Console.WriteLine( "The Uninstall method of 'MyInstallerSample' has been called" );
   }
}

到此这篇关于C#创建控制Windows服务的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C#创建控制Windows服务

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C#中怎么创建控制Windows服务

今天小编给大家分享一下C#中怎么创建控制Windows服务的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。需求针对一种特殊的应
2023-06-29

C#如何创建Windows服务

小编给大家分享一下C#如何创建Windows服务,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!C#创建Windows服务(Windows Services)Win
2023-06-18

C#怎么创建Windows服务程序

本篇内容主要讲解“C#怎么创建Windows服务程序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#怎么创建Windows服务程序”吧!C#创建Windows服务程序:在介绍如何C#创建Win
2023-06-18

C#Windows服务程序中如何为Windows服务创建安装项目

小编给大家分享一下C#Windows服务程序中如何为Windows服务创建安装项目,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!C#Windows服务程序之安装项目的由来:本文介绍如何创建Windows 服务应用程序(以前
2023-06-18

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

这篇文章主要介绍C#如何创建Windows服务与服务的安装、卸载,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行
2023-06-29

Laravel中如何创建控制器

这篇文章给大家分享的是有关Laravel中如何创建控制器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。为了替代在路由文件中以闭包形式定义的所有的请求处理逻辑,如果想要使用控制类来组织这些行为,控制器能将相关的请求
2023-06-21

c++ windows下创建共享内存

在Windows下,可以使用CreateFileMapping函数来创建共享内存。以下是一个示例代码:```cpp#include #include int main(){// 创建共享内存HANDLE hMapFile = CreateF
2023-08-19

【域控服务搭建】Windows Server 2012搭建域

实验设备: win11,win7,windows server 2012 实验准备: Windows server 2012设置好静态IP,保证相互之间可以ping通 写在前面的话:在Linux加入域那里可能会发现域名跟刚开始搭建的域名不同
2023-08-19

Linux进程控制【创建、终止、等待】

✨个人主页: Yohifo 🎉所属专栏: Linux学习之旅 🎊每篇一句: 图片来源 🎃操作环境: CentOS 7.6 阿里云远程服务器 Good judgment comes fro
2023-08-20

Python怎么远程控制Windows服务器

本篇内容主要讲解“Python怎么远程控制Windows服务器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么远程控制Windows服务器”吧!在很多企业会使用闲置的 Window
2023-06-30

python 通过元类控制类的创建

一、python中如何创建类?1. 直接定义类class A:   a = 'a' 2. 通过type对象创建在python中一切都是对象在上面这张图中,A是我们平常在python中写的类,它可以创建一个对象a。其实A这个类也是一个对象,它
2023-01-31

.NET6创建Windows服务的实现步骤

创建.NET6Windows服务步骤第一步:创建新项目使用VisualStudio创建一个新的.NETCore控制台应用程序项目。第二步:添加Windows服务支持添加一个Windows服务项目项,并在Service.cs文件中实现IService接口。第三步:定义服务行为实现OnStart、OnStop、OnShutdown和Run方法以定义服务行为。第四步:实现服务逻辑在Run方法中实现服务业务逻辑,例如使用计时器执行后台任务。第五步:配置服务元数据设置服务名称、显示名称和描述。第六步:生成和安装服务
.NET6创建Windows服务的实现步骤
2024-04-02

ImportBeanDefinitionRegistrar手动控制BeanDefinition创建注册详解

这篇文章主要为大家介绍了ImportBeanDefinitionRegistrar手动控制BeanDefinition创建注册详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-12-26

C# 中怎么创建一个复合控件

本篇文章为大家展示了C# 中怎么创建一个复合控件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。构建提供丰富的客户端接口的复杂Web控件经常需要把一些客户端JavaScript代码与控件的服务器端代码
2023-06-17

C#Windows应用程序开发创建窗体

本篇内容主要讲解“C#Windows应用程序开发创建窗体”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#Windows应用程序开发创建窗体”吧!C#Windows应用程序开发之创建窗体的前言:
2023-06-18

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录