一、 window服務是什麼
當你單擊“開始”,執行“services.msc”命令。就會看見如下視窗。它顯示的是當前作業系統中系統內建的服務或者第三方軟體安裝的服務。服務的狀態有名稱、描述、啟動狀態、啟動類型等等。你也可以在此表單中管理相關服務,注意謹慎操作,防止系統錯誤或軟體故障。
在此,為了讓大家對後面使用的代碼項目有個整體瞭解。整個專案有如下項目:
1、ServerForm: 一個WinForm程式,為window服務MyService測試而調用(永遠只彈出一個,除非之前彈出的ServerForm的關閉)。
2、CreateWSSetup:一個Console程式,為window服務MyService
產生安裝和卸載指令碼而使用。並且在服務安裝包MyServiceSetup中調用。傳入參數install標識安裝和啟動服務,unstall表示停止和卸載服務。
3、MyService: 我們今天的重點,一個Window服務程式。
4、MyServiceSetup:一個Window服務的安裝包程式。支援Window服務MyService的安裝和啟動、停止和卸載。
二、 Window服務如何開發
在這裡只從C#.NET開發的角度,來簡單介紹Window服務的開發。
1、 建立一個Window服務項目。
2、 編寫MyService主要代碼
MyService類繼承微軟封裝的服務基類ServiceBase
public partial class MyService : ServiceBase
服務啟動OnStart(string[] args),你可以選擇是否帶傳入參數來執行服務。
// 啟動服務
protected override void OnStart(string[] args)
{
// 在此處添加代碼以啟動服務
timer.Enabled = true;
}
服務停止OnStopt()
// 停止服務
protected override void OnStop()
{
// 在此處添加代碼以執行停止服務所需的關閉操作。
timer.Enabled = false;
System.Diagnostics.Process[] myproc = System.Diagnostics.Process.GetProcessesByName("ServerForm");
if (myproc != null && myproc.Length > 0)
{
int n = myproc.Length;
for (int i = 0; i < n; i++)
{
myproc[i].Kill();
}
}
}
此處為自訂函數,實現定時彈出第三方程式頁面。ServerForm是另外一個C#.NET的WinForm程式。我們把它放到
MyService\Bin\Debug下面。
// 定時執行
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
System.Diagnostics.Process[] myproc = System.Diagnostics.Process.GetProcessesByName("ServerForm");
if (myproc == null || myproc.Length == 0)
{
// 控製程序, 單例執行
System.Diagnostics.Process.Start(AppDomain.CurrentDomain.BaseDirectory + "ServerForm.exe");
}
}
最後,我們看下完整的MyService代碼
public partial class MyService : ServiceBase
{
private static System.Timers.Timer timer = null;
// 服務構造
public MyService()
{
InitializeComponent();
if (timer == null)
{
timer = new System.Timers.Timer();
timer.Enabled = true;
timer.Interval = 10000; // 10秒
timer.Elapsed += new System.Timers.ElapsedEventHandler(this.timer_Elapsed);
this.ServiceName = "MyService";
}
}
// 啟動服務
protected override void OnStart(string[] args)
{
// 在此處添加代碼以啟動服務
timer.Enabled = true;
}
// 停止服務
protected override void OnStop()
{
// 在此處添加代碼以執行停止服務所需的關閉操作。
timer.Enabled = false;
System.Diagnostics.Process[] myproc = System.Diagnostics.Process.GetProcessesByName("ServerForm");
if (myproc != null && myproc.Length > 0)
{
int n = myproc.Length;
for (int i = 0; i < n; i++)
{
myproc[i].Kill();
}
}
}
// 定時執行
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
System.Diagnostics.Process[] myproc = System.Diagnostics.Process.GetProcessesByName("ServerForm");
if (myproc == null || myproc.Length == 0)
{
// 控製程序, 單例執行
System.Diagnostics.Process.Start(AppDomain.CurrentDomain.BaseDirectory + "ServerForm.exe");
}
}
}
佈建服務的Install組件。當我們寫好一個MyService.cs服務後,它還不能直接安裝和註冊。我們還需要為它配置Install安裝組件,具體操作步驟如下:
步驟1:選中服務MyService.cs,雙擊滑鼠。在VS2008左邊地區彈出MyService.cs[設計]*選項卡。
步驟2:在“MyService.cs[設計]*選項卡”中,右鍵按一下滑鼠選項“添加安裝程式”。
在執行“添加安裝程式”之後,可以看見項目中多了如下檔案和組件。
步驟3:設定安裝服務的相關屬性
1、設定組件serviceInstaller1的主要屬性
StartType: AutoMatic自動、Manual手動,Disabled禁止。
ServiceName: 服務系統標識,
在cmd命令中執行sr start/stop/query等等命令時候使用,用來唯一標識一個Window服務。
2、設定組件serviceProcessInstaller1的主要屬性
Accout:賬戶類型。LocalService基於本機運行服務、NetworkService基於網路運行服務、LocalSystem本地系統服務、User基於使用者認證的服務。
3、 設定服務安裝後“允許和案頭進行互動”,
需要在ProjectInstaller.cs中添加如下代碼。
namespace MyService
{
[RunInstaller(true)]
public partial class ProjectInstaller : Installer
{
public ProjectInstaller()
{
InitializeComponent();
}
protected override void OnAfterInstall(IDictionary savedState)
{
try
{
base.OnAfterInstall(savedState);
// 允許服務案頭互動
System.Management.ManagementObject myService = new System.Management.ManagementObject(string.Format("Win32_Service.Name='{0}'", this.serviceInstaller1.ServiceName));
System.Management.ManagementBaseObject changeMethod = myService.GetMethodParameters("Change");
changeMethod["DesktopInteract"] = true;
System.Management.ManagementBaseObject OutParam = myService.InvokeMethod("Change", changeMethod, null);
}
catch (Exception ex)
{
}
}
}
}
三、 Windows服務的安裝和卸載
注意:在執行安裝或卸載服務前,我有把服務需要的相關檔案,複製到C:\MyService\下面或其他路徑。一旦安裝完成後,此目錄不能變更,否則不能卸載該服務和服務運行會報錯。
方法一:cmd命令方式
單擊開始,執行cmd命令。在彈出cmd視窗中安裝或卸載服務。
1、 安裝服務: sr start為啟動服務
基本命令,如下:
%systemroot%\microsoft.net\framework\v2.0.50727\installUtil.exe C:\MyService\MyService.exe
sc start "TaskWS"
步驟1:安裝MyServie服務,如:
執行安裝命令,接著顯示安裝和註冊服務的結果訊息,如。
步驟2:如,顯示結果安裝服務成功,接下來我們去服務管理介面,查看服務是否出現。如所示。
步驟3:接下來啟動MyService服務:執行sc start "MyService"命令。
2、卸載服務
sc stop "MyService"
%systemroot%\microsoft.net\framework\v2.0.50727\installUtil.exe /u C:\MyService\MyService.exe
操作步驟,類似安裝服務的步驟,略。
方法二:bat檔案方式:
原理就是方法一,只是把安裝和卸載服務的命令放到installWS.bat和unstallWS.bat中。而且為了減少使用者自己寫指令碼,可以開發一個工具CreateWSSetup.exe負責產生制定Window服務的安裝和卸載指令碼bat檔案。
方法三:將服務程式打包成安裝包
注意:這裡我會建立一個安裝項目MyServiceSetup和Console項目CreateWSSetup,其中CreateWSSetup的功能主要是根據MyService.exe產生服務的安裝指令碼和卸載指令碼,並且根據傳入參數intall執行安裝和啟動服務,unstall執行停止和卸載服務。
實現原理,選擇安裝項目,添加項目輸出MyService、添加視圖中的行為:
安裝:添加項目輸出CreateWSSetup.exe,參數為install。
卸載:添加項目輸出CreateWSSetup.exe,參數為unstall。
步驟1:添加項目輸出,添加MyServie和CreateWSSetup項目輸出。
步驟2:添加操作行為: 添加安裝和卸載的操作行為
添加安裝的自訂行為:選擇項目輸出CreateWSSetup,設定參數install.
接著設定“安裝”的屬性:Arguments(install,這個是自己定義,根據你寫的執行程式而定)和InstallClass(選否,是因為CreateWSSetup.cs不是一個InstallClass)。
添加卸載的自訂行為:選擇項目輸出CreateWSSetup,設定參數unstall。操作畫面和安裝的自訂行為相同,這裡就不了。
步驟3:選中安裝項目MyServiceSetup,執行“重建”,即可在Bin\Debug下面得到Window服務MyService的安裝和卸載的程式包。
四、 Window 服務如何調試
首先安裝好服務,然後剩下的事情就和普通程式調試一樣了。
注意安裝的路徑,應該是程式所在的Bin\Debug\下的服務程式exe檔案。
五、 Window 服務的使用價值
1、 建立定時執行的工作任務。
2、 建立伺服器監控程式。
3、 公用的應用程式提供者。
4、 其他用途。
六、 Window服務使用演習
MyService服務定時彈出的程式,你也可以自己寫一個Form1.exe程式放到服務中。比如查詢服務器上的已有服務。或者重啟資料庫或IIS等等。
其他:
1、安裝服務:
方法1: (可以安裝多個服務執行個體)
sc create "MyService_PRD" binPath= "H:\Program Files\MyServiceSetup\MyService"
sc start "MyService_PRD"
---- 產生服務1: MyService_PRD
--
sc create "MyService_DEV" binPath= "H:\Program Files\MyServiceSetup\MyService"
sc start "MyService_DEV"
---- 產生服務2: MyService_DEV
方法2: (不能安裝多個服務執行個體)
%systemroot%\microsoft.net\framework\v2.0.50727\installUtil.exe "H:\Program Files\MyServiceSetup\MyService.exe"
sc start "MyService"
2、卸載服務
方法1:
sc delete "MyService_PRD"
方法2:
sc stop "MyService"
%systemroot%\microsoft.net\framework\v2.0.50727\installUtil.exe /u "H:\Program Files\MyServiceSetup\MyService.exe"
後記:
改項目已經在Window XP\Window Server 2003中,驗證了安裝包的正確運行無誤。但是在Window Server 2008中,系統會彈出系統警告視窗“服務已經支援與案頭互動,但是系統沒有配置允許:服務允許和案頭進行互動”,如果朋友有知道解決辦法的不妨告訴我。多謝。