• .net中的windows service与服务操作


    打开VS2008,“文件→新建→项目”,选择“Windows”项中的“Windows服务”,根据自己的情况修跑径和名称,这里的名称修为“WriteTextService”,确定后,出现一个“若要在类中添加组件,请从工具箱中拖出它们,然后例用”属性”窗口来设置它们的属性。若要为类创建方法和事件,请单击此处切换到代码视图。”的一个界面,我们如果处理业务逻辑,单击“单击此处切换到代码视图”,来转换到代码页。
    代码
    WriteTextService.cs
     
    1using System;
    2using System.ServiceProcess;
    3using System.IO;
    4using System.Threading;
    5
    6namespace WriteTextServiceNS
    7{
    8        public partial class WriteTextService : ServiceBase
    9        {
    10                public WriteTextService()
    11                {
    12                        InitializeComponent();
    13                }
    14                protected override void OnStart(string[] args)
    15                {
    16                        Thread t = new Thread(new ThreadStart(DY));
    17                        t.Start();                                            
    18                }
    19                private void DY()
    20                {
    21                        while (true)
    22                        {
    23                                File.WriteAllText(@"F:/gsw.txt",DateTime.Now.ToString());
    24                                Thread.Sleep(2000);
    25                        }
    26                }
    27                protected override void OnStop()
    28                {
    29                }
    30        }
    31}
    32
    现在,我们还需要在服务中创建一个服务安装类,来完成服务初始化安装工作。
    我们创建一个类ServiceInstall
    ServiceInstall.cs
     
    1using System.Collections;
    2using System.Configuration.Install;
    3using System.ServiceProcess;
    4using System.ComponentModel;
    5using Microsoft.Win32;
    6
    7namespace WriteTextServiceNS
    8{    
    9        [RunInstaller(true)]
    10        public class ServiceInstall : Installer
    11        {
    12                private ServiceInstaller WTSerInst;    //它由安装实用工具用来将与服务关联的注册表值写入 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services 注册表项内的子项。
    13                private ServiceProcessInstaller    WTProInst;    //安装实用工具使用它来写与要安装服务关联的注册表值。
    14                public ServiceInstall()
    15                {
    16                        WTProInst = new ServiceProcessInstaller();
    17                        WTProInst.Account = ServiceAccount.LocalSystem;    //安装服务时使用的账户
    18                    
    19                        WTSerInst = new ServiceInstaller();                        
    20                        WTSerInst.StartType = ServiceStartMode.Automatic ; //启动服务的后模式(Automatic 自动,Manual 手动,Disabled 禁用)    
    21                        WTSerInst.ServiceName = "WriteTextService";     //要安装服务的名称 与服务类名相同
    22                        
    23                        Installers.Add(WTSerInst);    //把服务安装类放入安装集合中
    24                        Installers.Add(WTProInst);
    25                }
    26                /**//// <summary>
    27                /// 重写父类的安装,并在安装服务后写入服务的描述
    28                /// </summary>
    29                /// <param name="stateSaver"></param>
    30                public override void Install(IDictionary stateSaver)
    31                {
    32                        RegistryKey system,service,config;
    33                        try
    34                        {
    35                                base.Install(stateSaver);
    36                                system = Registry.LocalMachine.OpenSubKey("System").OpenSubKey("CurrentControlSet").OpenSubKey("Services");
    37                                service = system.OpenSubKey(this.WTSerInst.ServiceName, true);
    38                                service.SetValue("Description", "……这是一个每秒写入Text一次时间的服务……");                            
    39                                config = service.CreateSubKey("AdditionalInformation");
    40                        }
    41                        catch
    42                        { }
    43                }
    44                /**//// <summary>
    45                /// 重写父类的卸载,并在卸载服务后删除描述
    46                /// </summary>
    47                /// <param name="stateServer"></param>
    48                public override void Uninstall(IDictionary stateServer)
    49                {
    50                        RegistryKey system,currentControlSet,services,service;
    51                        try
    52                        {
    53                                system = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("System");
    54                                currentControlSet = system.OpenSubKey("CurrentControlSet");
    55                                services = currentControlSet.OpenSubKey("Services");
    56                                service = services.OpenSubKey(this.WTSerInst.ServiceName, true);
    57                                service.DeleteSubKeyTree("AdditionalInformation");
    58                        }
    59                        catch    
    60                        {}
    61                        finally
    62                        {
    63                                base.Uninstall(stateServer);
    64                        }
    65                }
    66        }
    67}
    68
     
    这样就完成了一个服务,关且有服务的描述,最要是通过重写父类Install和Uninstall来完成对服务描述的添加。因为服务都是在HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/WriteTextService下有个项Description,给这个项添加数据就对应该服务的描述,所以Install和Uninstall两个方法本质上就是注册表英的添加与删除。
     
    接下来我们看一下服务的操作,即装载,卸载,启动,停止。
    我们新建一个web网站,只有一个Default.aspx页面,代码如下:
    Default.aspx
     
    1<%@ Page Language="C#" AutoEventWireup="true"    CodeFile="Default.aspx.cs" Inherits="_Default" %>
    2
    3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    4
    5<html xmlns="http://www.w3.org/1999/xhtml">
    6<head runat="server">
    7        <title>无标题页</title>
    8</head>
    9<body>
    10        <form id="form1" runat="server">
    11        <div>
    12        
    13                <asp:Button ID="Button1" runat="server" Text="装载服务" />
    14                <asp:Button ID="Button2" runat="server" Text="卸载服务" />
    15                <asp:Button ID="Button3" runat="server" Text="启动服务" />
    16                <asp:Button ID="Button4" runat="server" Text="停止服务" />
    17        
    18        </div>
    19        </form>
    20</body>
    21</html>
    22
     
    Default.aspx.cs
     
    1using System;
    2using System.Configuration;
    3using System.Web;
    4using System.Web.Security;
    5using System.Web.UI;
    6using System.Web.UI.HtmlControls;
    7using System.Web.UI.WebControls;
    8using System.Web.UI.WebControls.WebParts;
    9using System.Xml.Linq;
    10using System.Configuration.Install;
    11using System.Collections;
    12using System.ServiceProcess;
    13
    14
    15public partial class _Default : System.Web.UI.Page    
    16{
    17        protected void Page_Load(object sender, EventArgs e)
    18        {
    19
    20        }
    21        protected void Button1_Click(object sender, EventArgs e)
    22        {
    23                AssemblyInstaller myassemblyinstaller = new AssemblyInstaller();//加载一个程序集,并运行其中的所有安装程序。
    24                myassemblyinstaller.UseNewContext = true;
    25                myassemblyinstaller.Path = @"f:/gsw.exe";//服务所在的路径
    26                Hashtable mysavedstate = new Hashtable();
    27                myassemblyinstaller.Install(mysavedstate);
    28                myassemblyinstaller.Commit(mysavedstate);
    29                myassemblyinstaller.Dispose();
    30                Response.Write("安装服务成功");
    31        
    32        }
    33        protected void Button2_Click(object sender, EventArgs e)
    34        {
    35                AssemblyInstaller myassemblyinstaller = new AssemblyInstaller();
    36                myassemblyinstaller.UseNewContext = true;
    37                myassemblyinstaller.Path = @"f:/gsw.exe";//服务所在的路径
    38                myassemblyinstaller.CommandLine = new string[1] { "/u" };// 利用/u命令来完成卸载
    39                myassemblyinstaller.Uninstall(null);
    40                myassemblyinstaller.Dispose();
    41                Response.Write("卸载服务成功");
    42        }
    43        protected void Button3_Click(object sender, EventArgs e)
    44        {
    45                ServiceController sc = new ServiceController();//表示 Windows 服务并允许连接到正在运行或者已停止的服务、对其进行操作或获取有关它的信息。
    46                sc.DisplayName = "桂素伟";
    47                sc.ServiceName = "WriteTextService";
    48                sc.Start();//启动这个名称的服务
    49                System.Threading.Thread.Sleep(1000);
    50                sc.Refresh();//刷新服务的状态
    51                if (sc.Status == ServiceControllerStatus.Running)//判断服务是已经运行
    52                {
    53                    Response .Write ("服务成功启动!");
    54                }
    55        }
    56        protected void Button4_Click(object sender, EventArgs e)
    57        {
    58                ServiceController sc = new ServiceController();
    59                sc.ServiceName = "WriteTextService";
    60                sc.Stop();
    61                
    62                System.Threading.Thread.Sleep(1000);
    63                sc.Refresh();//刷新服务的状态
    64                if (sc.Status == ServiceControllerStatus.Stopped)//判断服务是已经运行
    65                {
    66                     Response .Write ("服务成功停止!");
    67                }
    68        }
    69}
    70
     
    我们是通过AssemblyInstaller类来完成对服务的装载和卸载,通过ServiceController类来完成对服务的启动和停止。
    这样,我们就把服务和控制服务的代友做完整了。
    (我的代码是在vista和vs2008下实现的。)
     
  • 相关阅读:
    Entity Framework Code First 学习日记(1)精
    敏捷宣言
    VS2013中web项目中自动生成的ASP.NET Identity代码思考
    ReSharper 配置及用法
    MVC中的Repository模式
    关于Repository模式
    Entity Framework 学习总结之十一:POCO
    Linux Centos7 离线安装docker 【官网翻译和注释】
    企业服务总线ESB
    面向服务的架构SOA
  • 原文地址:https://www.cnblogs.com/amylis_chen/p/2289652.html
Copyright © 2020-2023  润新知