本實例主要實現下面三個基本功能
1、C#開發windows服務
2、禁止QQ等程序運行
3、為windows服務創建自動安裝程序
下面針對這三個基本功能進行實現
一、C#開發windows服務
Windows服務在VS以前的版本中叫NT服務,在VS.NET啟用了新的名稱。用C#創建windows服務不是一件困難的事,下頁針對服務創建、啟動、停止做詳細介紹
1、首先在vs中添加一winform程序KillService

2、在解決方案添加新項中添加Windows服務

3、打開服務頁面,切換至代碼頁面有兩個方法如下:
protected override void OnStart(string[] args) { // TODO: 在此處添加代碼以啟動服務。 } protected override void OnStop() { // TODO: 在此處添加代碼以執行停止服務所需的關閉操作。 }
當服務啟動之后一般會要求每隔幾秒或者幾分鍾刷新一次數據,所以要用到一個定時器,在定時器里邊進行業務操作。windows服務不能直接在VS下進行調試,所以可以選擇使用日志形式記錄服務的各種啟動停止或者異常的狀態。具體實現代碼如下:
partial class Service1 : ServiceBase { static System.Timers.Timer oTimer_Get = new System.Timers.Timer(); public Service1() { InitializeComponent(); } protected override void OnStart(string[] args) { // TODO: 在此處添加代碼以啟動服務。 AutoLog = false; FileLog.Success("服務已啟動"); oTimer_Get.Enabled = true; oTimer_Get.Interval = 10000; oTimer_Get.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent); } private void OnTimedEvent(object sender, System.Timers.ElapsedEventArgs e) { FileLog.Success("開始發送"); oTimer_Get.Enabled = false; try { //此處可進行編寫詳細的業務操作 } catch (Exception ex) { FileLog.Error(ex.Source + "。" + ex.Message); } oTimer_Get.Enabled = true; FileLog.Success("結束發送"); } protected override void OnStop() { // TODO: 在此處添加代碼以執行停止服務所需的關閉操作。 FileLog.Success("服務已停止"); oTimer_Get.Enabled = false; } }
文件記錄類代碼
/// <summary> /// 文件型日志記錄 /// </summary> public static class FileLog { private static string sFilePath = System.Configuration.ConfigurationSettings.AppSettings["UserLog"]; /// <summary> /// 錯誤日志 /// </summary> /// <param name="Message">錯誤內容</param> public static void Error(string Message) { try { if (!Directory.Exists(sFilePath)) { Directory.CreateDirectory(sFilePath); } string sFileName = sFilePath + "\\" + string.Format("{0}-Error.txt", DateTime.Now.ToString("yyyy-MM-dd")); string sContent = string.Format("{0}-- {1}\r\n", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Message); FileStream fs = new FileStream(sFileName, FileMode.Append); Byte[] b = Encoding.Default.GetBytes(sContent); fs.Write(b, 0, b.Length); fs.Close(); } catch { } } /// <summary> /// 正確日志 /// </summary> /// <param name="Message">正確內容</param> public static void Success(string Message) { try { if (!Directory.Exists(sFilePath)) { Directory.CreateDirectory(sFilePath); } string sFileName = sFilePath + "\\" + string.Format("{0}-Success.txt", DateTime.Now.ToString("yyyy-MM-dd")); string sContent = string.Format("{0}-- {1}\r\n", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Message); FileStream fs = new FileStream(sFileName, FileMode.Append); Byte[] b = Encoding.Default.GetBytes(sContent); fs.Write(b, 0, b.Length); fs.Close(); } catch { } } }
4、服務需要一個啟動入口,打開program.cs文件在main函數里邊編寫入口代碼如下:
static class Program { /// <summary> /// 應用程序的主入口點。 /// </summary> [STAThread] static void Main() { ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { new Service1() }; ServiceBase.Run(ServicesToRun); } }
到此windows服務編寫完成,但是現在該服務沒有什么的業務操作功能。接下來實現禁止本機QQ程序運行功能
二、禁止QQ等程序運行
只需獲取本機所有運行的進行,通過Process.kill()方法結束該進程即可
Process[] process = Process.GetProcesses(); for (int i = 0; i < process.Length; i++) { if (process[i].ProcessName == "QQ") { process[i].Kill(); } }
將該操作放至windows服務中的業務操作模塊即可。
三、為windows服務創建自動安裝程序
上面實現了windows服務基本的業務操作功能,下面為該windows服務創建自動安裝程序,
1、切換至service.cs設計頁面,右鍵選擇添加安裝程序

2、這時項目中就添加了一個新類 ProjectInstaller 和兩個安裝組件 ServiceProcessInstaller 和 ServiceInstaller,並且服務的屬性值被復制到組件。

3、若要確定如何啟動服務,請右鍵 ServiceInstaller1屬性並將 StartType 屬性設置為適當的值。
Manual 服務安裝后,必須手動啟動。Automatic 每次計算機重新啟動時,服務都會自動啟動。Disabled 服務無法啟動。

4、將serviceProcessInstaller類的Account屬性改為 LocalSystem這樣,不論是以哪個用戶登錄的系統,服務總會啟動。

這些windows服務的安裝程序已經完成。通過從生成菜單中選擇生成來生成項目。
注意 不要通過按 F5 鍵來運行項目——不能以這種方式運行服務項目。
5、創建啟動和停止文件

安裝文件Install.bat實現如下:
cd %SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe KillService.exe
Net Start 自動查殺服務
sc config 自動查殺服務 start= auto
KillService.exe是你生成的可執行文件的路徑
自動查殺服務是windows服務的名稱
停止文件Uninstall.bat文件的實現如下:
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u KillService.exe
KillService.exe是你生成的可執行文件的路徑
PS:當這兩個文件保存成功之后,執行時一定要“以管理員身份運行”,否則服務啟動出錯
如果服務安裝成功,可以在資源管理器中的服務查看到正在運行的自動查殺服務。
至此整個實例基本完成
本實例主要是為了學習Windows服務的開發,啟動,停止。具體業務功能根據需求進行調整,比如定時從webservice接口中獲取新添加的數據等需求
