部分一(Windows服務初探,對於服務安裝部分,如果看不明白,不要強看,直接看部分二):
第一步:
首先開啟Visual Studio並且選擇Visual C#工程。選擇模板類型為Windows服務,並命名為Monitoring,如所示:
第二步:
按F7鍵開啟代碼視窗。然後,加入對System.IO命名空間的引用,以便把系統定時功能編寫到一個檔案中。下一步,用Monitoring一詞替換所有出現的Service1一詞。之後,轉入設計模式(按鍵shift+F7)。選擇Solution Explorer(按鍵Ctrl+Alt+L)。點擊Service1.cs並且命名它為Monitoring.cs。
之後,轉入代碼視窗。在OnStart事件中加入下列代碼,如所示:
在OnStart事件中實現的功能
首先,在c盤上建立一個xml檔案,並命名為file1。然後,在這個檔案中建立如下代碼:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<times>
然後,關閉它。
我建立了一個服務,它能夠在系統啟動時自動啟動並且記錄下啟動時間。當系統關閉時,它也關閉。而且,它會記錄下關閉時間和系統中所花費的時間。
首先,我要建立一個StreamWriter來把系統啟動時間寫入file1.xml檔案中。
在把代碼複製到你的OnStart事件後,正好在Monitoring構造器的上面建立一個公開變數temp,如所示:
此後,把這部分代碼複製到你的代碼視窗:
再把下面代碼複製到OnStart事件中,如所示:
StreamWriter writer=File.AppendText("d:\\file1.xml");
writer.Write("<time>");
writer.WriteLine("<Date> "+ (DateTime.Now.ToString("dd-MM-yy"))+"</Date>");
writer.WriteLine("<started> "+ (DateTime.Now.ToString("t"))+"</started>");
temp=DateTime.Now;
writer.Close();
在OnShutdown事件中實現的功能
當系統要關閉時,我使用一個StreamWriter再次開啟file1.xml-它將記下系統關閉時間,還將記下在系統啟動和關閉之間所花費的時間跨度。我在OnStart和OnShutdown事件中使用了一個temp變數。在OnStart中,它用於儲存啟動時間。然後,它被再次用於OnShutdown事件中來記下系統啟動和關閉之間所花費的時間間隔。
然後,我們必須配置我們的Windows服務以便安裝和運行。
因此,首先轉到設計檢視中,並選擇屬性視窗(可以按下F4)。
把CanStop和CanShutdown設定為true。在安裝之前,我們必須要安裝一個安裝程式。
右擊設計檢視視窗,然後選擇"Add Installer"。然後,它將顯示ProjectInstaller.cs。在這個檔案中,serviceInstaller1和serviceProcessInstaller1都存在。轉到serviceProcessInstaller1屬性處:
・ 把Account設定為LocalSystem。
・ 然後,轉到serviceInstaller1屬性處。
・ 把DisplayName和ServiceName設定為Monitoring。
・ 設定啟動類型(StartType)為automatic。
請參考:
然後,轉到VS.NET的命令提示字元下。
在控制台下,轉到服務的Debug檔案夾下:
輸入"InstallUtil Monitoring.exe"
如果它顯示"Commit Phase Completed Successfully",則說明服務被成功安裝。
然後,重啟系統以啟動服務。在重啟之後,開啟file1.xml檔案,它記錄了系統的開始時間。如果關閉系統,它將記錄下系統的關閉時間和使用系統的時間長度。通過這一部分,我們已經完成了記錄下系統所消耗的時間。接下來,我們將建立一個web應用程式以便在一個Grid控制項中顯示xml數
部分二(Windows服務安裝與註冊):
最近一直在搞Windows服務,也有了不少經驗,感覺許可權方面確定比一般程式要受限很多,但方便性也很多。像後台運行不阻塞系統,不用使用者登入之類。哈哈,扯遠了,今天講一下那個怎麼給Windows服務做個安裝包。為什麼做安裝包?當然是方便了,不用每次調用InstallUtil,還有,就是看上去正規些。
不多說了,先來看看怎麼做吧。首先,當然是建立一個Windows服務的項目。這個大家應該都知道怎麼做(這都不明白的留言問我),然後要給服務“添加安裝程式”,1所示:(這一步和自己用InstallUtil註冊是完全一樣的)
(圖1)
添加後,會出來一個serviceProcessInstal1,還有serviceInstaller1,如果你一個項目裡有兩個服務的話,這裡就會有兩個serviceInstaller類,2:
(圖2)
圖3是serviceProcessInstal1的屬性頁面,其中Account就是指用於運行服務的帳戶,如果只是用於本地,可以選LocalSystem(本地系統),這是本地的最高許可權,並可以選擇和案頭互動功能。如果安全性考慮的話,請選擇適合自己的。
(圖3)
圖4是serviceInstaller2的屬性頁面,其中DisplayName就是顯示在Windows服務管理員中的服務名稱,Desciption是服務的說明。下面ServiceName是服務內部名稱。最關鍵的是下面的StartType,是指服務的啟動方式,是自動,手動和禁用三種。
(圖4)
下面,就是今天講的重點了,點擊“檔案”->“添加”->“建立項目”(5)
(圖5)
選擇“其他項目類型”->“安裝和部署”裡的“安裝項目”(6)
(圖6)
建好項目後,右鍵剛才建立的安裝項目,選擇“視圖”->“檔案系統”(7)
(圖7)
這時,開啟了檔案系統屬性。可以看到,螢幕左邊,出現了三項檔案系統的內容,因為我們是Windows服務程式,不需要在開始菜單和案頭上放置表徵圖,所以我們直接右鍵“應用程式檔案夾”->“添加”->“項目輸出”(8)
(圖8)
在出來的對話方塊中,選擇“主輸出”和“Release XXX”,這個由你的項目屬性決定,一般選擇Release Any CPU。(9)
(圖9)
系統會自動把項目輸出檔案,也就是Windows服務程式的EXE檔案和所有引用的類庫檔案都列在中間的框中。這時,為了方便安裝,我們把InstallUtil.exe和兩個我自己寫的批次檔一起添加進去。添加方法類似上面,只是把“項目輸出”改成“檔案”。
結果10所示:
(圖10)
接下來,就該配置一下安裝過程,讓安裝程式自動給我們安裝和卸載Windows服務。
還是右鍵安裝項目,選“視圖”->“自訂動作”,11:
(圖11)
左邊的視窗換到了自訂動作的視圖了,右鍵“安裝”->“添加自訂動作”(圖12),出現的對話方塊中,選中“應用程式檔案夾”,再選中其中的InstallUtil.exe檔案(圖13),添加好後,會在安裝操作下面多出一個InstallUtil.exe的分支。點一下它,在右邊的屬性頁面裡,設定Arguments=“ 你的Windows服務檔案名稱”,14(注意檔案名稱前要留一個空格)
(圖12)
(圖13)
(圖14)
同樣,在提交和卸載處,也添加InstallUtil.exe,不過屬性頁面中設定Arguments=“ -u 你的Windows服務檔案名稱”,這樣,安裝程式就能實現自動安裝註冊和卸載Windows服務了。(15)
(圖15)
接下來就該讓Windows服務和安裝項目同時被編譯了。右鍵點擊解決方案,選擇“屬性”(16),在出來的對話方塊中,勾上安裝項目後面的產生。(17)
(圖16)
(圖17)
最後,右鍵解決方案,選擇“產生解決方案”,這時vs會將兩個項目都會編譯出來。不過要注意一點:項目的啟動順序一定要Windows服務項目在前,安裝項目在後。