.net中的windows service與服務作業

來源:互聯網
上載者:User
開啟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現在,我們還需要在服務中建立一個服務安裝類,來完成服務初始化安裝工作。我們建立一個類ServiceInstallServiceInstall.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類來完成對服務的啟動和停止。這樣,我們就把服務和控制服務的代友做完整了。(My Code是在vista和vs2008下實現的。) 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.