如果你的程式需要系統沒有登入時就執行,也希望避免被誤關,就需要寫Windows Service.本篇介紹如何建立服務,事件記錄,安裝檔.下一卷會介紹除錯,資源檔和如何在系統欄做一個狀態程式去控制你的服務.
首先,建立一個Windows服務專案,這時候會產生一個包含服務檔的專案,例如Service1.cs,你可以現在修改成你想要的名稱.在Service1.cs上面按滑鼠右鍵->View Code就可以開始編寫Windows Service.
預設會有建構子和兩個方法,OnStart()和OnStop().
事件記錄
因為一個Service沒有介面,所以必需要用事件記錄來提供執行情況.我們首先在建構子裡加入事件記錄程式碼.
// 由於權限的關係,EventSource 必須要在安裝時建立 if (!EventLog.SourceExists(m_EventSourceName)) { EventLog.CreateEventSource(m_EventSourceName, m_EventLogName); } // 如果安裝時發現 EventSource 的 LogName 與我們預期的名稱不同時就重建! if (EventLog.LogNameFromSourceName(m_EventSourceName, ".") != m_EventLogName) { EventLog.DeleteEventSource(m_EventSourceName); EventLog.CreateEventSource(m_EventSourceName, m_EventLogName); } m_log = new EventLog(); m_log.Source = m_EventSourceName;
用m_log.WriteEntry()就可以寫入記錄,第二個參數EventLogEntryType是用來調教事件類型的.
檢查權限
通常Windows Service都會用到一些系統資源,一般會用administrator權限去執行,所以我會先檢查帳號權限
WindowsIdentity l_identity = WindowsIdentity.GetCurrent(); WindowsPrincipal l_principal = new WindowsPrincipal(l_identity); if( l_principal.IsInRole(WindowsBuiltInRole.Administrator)) { //... }
定時服務
一般服務都是一直執行的,除了伺服器類型的listen,最常見應該是定時服務,替你的服務加入一個System.Timers.Timer,在服務檔的Design View,從工具箱拉一個進去,請注意不是System.Windows.Forms.Timer.他們兩個是不一樣的,如果在工具箱找不到,可能要在工具箱按滑鼠右鍵->Choose Items...找一下,把它加回工具箱.
接下來設定Interval和加入Elapsed事件處理方法.把服務主程式放在事件處理裡面.還記得OnStart()嗎?現在把timer.Start()放在OnStart()裡面,服務就會定時作用了.
安裝器
這是編寫一個服務的最後一步,就是要為服務定義其安裝方法(不是安裝程式),安裝方法定義了服務名稱,初始狀態等設定.打開服務檔的Design View,點一下空白的地方,再看屬性視窗的下方,點那個Add Installer,就會自動生成
這時會出現兩個元件,serviceProcessInstaller和serviceInstaller,先設定serviceProcessInstaller的Account屬性,一般會用LocalSystem,接下來設定serviceInstaller,Description為服務描術,DisplayName為服務名稱.
安裝專案
最後為我們的服務建立安裝程式,在解決方案上按滑鼠右鍵->Add->New Project...->Other Project Types->Setup and Deployment->Setup Project
在該專案上按滑鼠右鍵->Add->Project Output...,一般會選Primary Output和Content Files,按OK
接下來,在該專案上按滑鼠右鍵->View->Custom Actions,再在Design View的Custom Actions上按滑鼠右鍵->Add Custom Action...,點兩下Application Folder,選那個之前新增好的Primary output,選OK.Build之後就完成了!
全建立一個.msi和一個setup.exe,點兩下那個msi就可以安裝Service,反安裝可以在msi上按右鍵選解除安裝或者用"控制台->程式和功能"也可以
下一篇再為大家介紹搭配系統服務用的一些東西,.settings,.resx,寫一個程式來管理服務等.