C# windows服務制作(包括安裝及卸載)


開篇語

因工作內容需要做一個windows服務,此前並沒有相關經驗,所以做了一個demo來跑跑這個梗(高手跳過,需要的來踩)~

效果如下:打開服務,可以找到我們新增的一個windows服務,這個demo是定時向一個txt文件輸出一句話

生成的以日期命名的txt文件

打開文件結果如下:

全過程梳理

本文將只粗略簡單的介紹一下windows服務是如何開發和安裝的

 一、創建windows服務
如圖新建一個Windows服務

進入程序如圖

空白服務如下

 1 public partial class Service1 : ServiceBase  
 2    {  
 3        System.Threading.Timer recordTimer;  
 4   
 5   
 6        public Service1()  
 7        {  
 8            InitializeComponent();  
 9        }  
10   
11   
12        protected override void OnStart(string[] args)  
13        {  
14        }  
15   
16   
17        protected override void OnStop()  
18        {  
19        }  
20    }  

只要在OnStart里完成你的功能代碼即可。本例中我們做一個定時向本地文件寫記錄的功能。

創建一個類,用戶寫文件

 1  /// <summary>  
 2         /// 保存至本地文件  
 3         /// </summary>  
 4         /// <param name="ETMID"></param>  
 5         /// <param name="content"></param>  
 6         public static void SaveRecord(string content)
 7         {
 8             if (string.IsNullOrEmpty(content))
 9             {
10                 return;
11             }
12             FileStream fileStream = null;
13             StreamWriter streamWriter = null;
14             try
15             {
16                 string path = Path.Combine(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase, string.Format("{0:yyyyMMdd}", DateTime.Now));
17 
18 
19                 using (fileStream = new FileStream(path, FileMode.Append, FileAccess.Write))
20                 {
21                     using (streamWriter = new StreamWriter(fileStream))
22                     {
23                         streamWriter.Write(content);
24 
25 
26                         if (streamWriter != null)
27                         {
28                             streamWriter.Close();
29                         }
30                     }
31 
32                     if (fileStream != null)
33                     {
34                         fileStream.Close();
35                     }
36                 }
37             }
38             catch { }
39         }  

如圖那么在Service1中調用

 1 public partial class Service1 : ServiceBase
 2     {
 3         System.Threading.Timer recordTimer;
 4         public Service1()
 5         {
 6             InitializeComponent();
 7         }
 8 
 9         protected override void OnStart(string[] args)
10         {
11             IntialSaveRecord();
12         }
13         /// <summary>
14         /// 定時檢查,並執行方法
15         /// </summary>
16         /// <param name="source"></param>
17         /// <param name="e"></param>
18         private void IntialSaveRecord()
19         {
20             TimerCallback timerCallback = new TimerCallback(CallbackTask);
21 
22             AutoResetEvent autoEvent = new AutoResetEvent(false);
23             recordTimer = new System.Threading.Timer(timerCallback, autoEvent, 0, 10000);//其中參數10000表示延時執行服務的時間間隔,毫秒為單位
24         }
25         //方法
26         private void CallbackTask(Object stateInfo)
27         {
28             Show_Java.SaveRecord(string.Format(@"當前記錄時間:{0},狀況:程序運行正常!", DateTime.Now));
29         }
30 
31         protected override void OnStop()
32         {
33             if (recordTimer != null)
34             {
35                 recordTimer.Dispose();
36             }
37         }
38     }

安裝程序

這樣服務算是寫的差不多了,下面添加一個安裝程序,用於安裝服務。

如圖,在service1頁面空白處右鍵-添加安裝程序

添加一個安裝程序,如圖,添加完成后

設置相應的屬性,給serviceInstaller1設置屬性,主要是描述信息。如圖,

給serviceProcessInstaller1設置,主要是account。一般選localsystem,如圖

這樣服務已經寫好了。那么如何添加到windows服務里面去呢。這里推薦一種簡單實用的方法(也可以通過代碼來安裝,這里就不做過多講解了)

安裝服務

 上面寫好的服務,最終生成的是一個exe文件。如圖,

安裝程序安裝時需要用到這個exe的路徑,所以方便起見,將這個生成的exe文件拷貝至安裝程序的運行目錄下。(這里我將exe拷貝到D盤shows文件夾下面)

用管理員權限打開cmd窗口

然后分別執行

@SET FrameworkDir=%WINDIR%\Microsoft.NET\Framework
@SET FrameworkVersion=v2.0.50727
@SET PATH=%FrameworkDir%\%FrameworkVersion%;%WINDIR%\System32;%PATH%;

 

InstallUtil.exe D:\路徑\程序名稱.exe        //安裝服務
InstallUtil.exe /u D:\路徑\程序名稱.exe    //卸載服務(程序安裝好了,如果想要修改,需要先卸載該服務,再次執行安裝)

運行后若無錯誤,效果應該如下

運行完后在服務中查看,如圖:

再在安裝目錄下看記錄的文件(因為我們設置項目的時候選的是手動,此時要記住啟動該服務,程序才會定時執行)

這樣,一個windows服務算是安裝成功了。(方法多種多樣,希望各位多提寶貴意見,不勝感激~)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM