.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下實現的。)