Main函數決定調用本軟件的那個功能模塊,由於Main函數本身具有安裝和卸 載服務的功能,首先得找到微軟.NET框架所帶的InstallUtil.exe的完整的路徑。微軟.Net編 程中,基礎類型string屬於mscorlib.dll,因此可以使用typeof (string).Assembly.CodeBase獲得文件mscorlib.dll的絕對路徑名,而InstallUtil.exe和 mscorlib.dll是同一個目錄的,因此也就能獲得InstallUtil.exe的絕對路徑名了。
我們使用System.Environment.GetCommandLineArgs()獲得所有的命令行參數。遍歷所有的參 數,若存在“/install”則表示要安裝服務,於是調用InstallUtil.exe來將軟件 本身注冊為服務,若遇到“/uninstall”則調用InstallUtil.exe卸載服務,若遇 到“/clIEnt”則調用客戶端模塊,若遇到“/debug”則創建服務對象 ,調用它的StartFileSystemWatching模擬啟動服務,然後主線程阻塞掉,但此時文件系統監 視的功能性模塊還在運行,可以設置斷點進行調試。
若沒有遇到任何可識別的命令行 參數,則調用ServiceBase.Run函數來執行服務。
由於向Windows系統注冊自己為服務 時沒有指明任何命令行參數,因此服務管理器啟動進程時不會添加任何命令行參數,因此本 程序也就是以服務模式運行。若在Windows資源管理器中雙擊執行程序時也是以服務模式運行 ,此時沒有相關的運行環境,程序啟動後會報錯。此時必須添加程序代碼可識別的命令行參 數。
運行軟件
程序編寫完畢,編譯通過,生成一個MyWindowsService.exe文 件,我們就可以開始運行這個軟件了。
首先我們得向系統注冊服務,我們可以使用命 令行“程序路徑/MyWindowsService.exe /install”來注冊服務,也可以直接運 行“微軟.NET框架路徑/installutil.exe 程序路徑/MyWindowsService.exe”; 相反的,我們可以使用命令行“程序路徑/MyWindowsService.exe /uninstall” 或者“微軟.Net框架路徑/installutil.exe /u 程序路 徑/MyWindowsService.exe”來卸載服務。
安裝服務後,我們可以使用命令行 “程序路徑/MyWindowsService.exe /clIEnt”來運行該服務的客戶端軟件了。
小結
在本課程中,我們使用C#編寫了一個簡單的用於監視文件系統的Windows 服務,包括服務器軟件和客戶端軟件,若使用傳統的C++開發服務這種底層程序需要熟悉大量 的API函數,而微軟.NET框架很好的封裝了這些技術細節,簡化了編程過程,使得我們可以把 主要警力放在提供服務內容的功能性模塊的開發上來,從這裡可以看出基於微軟.Net框架是 可以低成本的開發出一些功能強大的軟件。