建立Windows Service 上卷

  • 5206
  • 0

如果你的程式需要系統沒有登入時就執行,也希望避免被誤關,就需要寫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,寫一個程式來管理服務等.

My WP Blog with english technical docs.