建立第一個windows服務

windows服務應用程序是一種長期運行在操做系統後臺的程序,它對於服務器環境特別適合,它沒有用戶界面,不會產生任何可視輸出,任何用戶輸出都回被寫進windows事件日誌。windows

計算機啓動時,服務會自動開始運行,他們不要用戶必定登錄才運行。數組

能夠經過選擇菜單「開始」-〉「控制面板」-〉「管理工具」-〉「服務」來查看現有系統中的服務,以下圖:服務器

建立一個windows服務ide

切換到代碼視圖修改.工具

using System;
using System.IO;
using System.ServiceProcess;

namespace WindowsServiceTest
{
    public partial class hjpServiceTest : ServiceBase
    {
        //定時器  
        System.Timers.Timer t = null;

        public hjpServiceTest()  
        {  
            InitializeComponent();  
  
            //啓用暫停恢復  
            base.CanPauseAndContinue = true;  
  
            //每5秒執行一次  
            t = new System.Timers.Timer(5000);  
            //設置是執行一次(false)仍是一直執行(true);  
            t.AutoReset = true;  
            //是否執行System.Timers.Timer.Elapsed事件;  
            t.Enabled = true;  
            //到達時間的時候執行事件(theout方法);  
            t.Elapsed += new System.Timers.ElapsedEventHandler(theout);   
        }  
  
        //啓動服務執行  
        protected override void OnStart(string[] args)  
        {  
            string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "啓動";  
            WriteLog(state);  
        }  
  
        //中止服務執行  
        protected override void OnStop()  
        {  
            string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "中止";  
            WriteLog(state);  
        }  
  
        //恢復服務執行  
        protected override void OnContinue()  
        {  
            string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "繼續";  
            WriteLog(state);  
            t.Start();  
        }  
  
        //暫停服務執行  
        protected override void OnPause()  
        {  
            string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "暫停";  
            WriteLog(state);
            t.Stop();  
        }  
  
  
        public void WriteLog(string str)  
        {  
            using (StreamWriter sw = File.AppendText(@"d:\service.txt"))  
            {  
                sw.WriteLine(str);  
                sw.Flush();  
            }  
        }  
  
        public void theout(object source, System.Timers.ElapsedEventArgs e)  
        {
            WriteLog("theout:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));  
        }  
    }
}

解釋:OnStart和OnStop分別是服務器啓動和中止後,所發生的事件操做方法.定義了一個定時器,每隔5秒執行一次(theout方法),由於暫停恢復功能默認是不啓用的,須要設置CanPauseAndContinue屬性啓用此功能,同時重寫OnStop和OnContinue方法,添加本身的邏輯代碼.spa

 

將服務程序hjpServiceTest.cs 切換到視圖模式,用鼠標右鍵單擊設計視圖選擇「添加安裝程序」選項,此後在項目中自動增長了一個ProjectInstaller.cs,操作系統

以下圖.net

 

打開ProjectInstaller,修改serviceInstaller1組件屬性命令行

 

Description= 個人服務備註                       服務備註說明debug

DisplayName=個人服務                            服務友好名字 

ServiceName=hjpServiceTest                         安裝服務器名字

StartType=Automatic                                服務類型

ü         Manual      服務安裝後,必須手動啓動。

ü         Automatic    每次計算機從新啓動時,服務都會自動啓動。

ü         Disabled     服務沒法啓動。

 

並設計serviceProcessInstaller1的屬性Account=LocalSystem

 

運行編譯,一個簡單的windows服務已經開發完成.

 

安裝window服務

安裝命令:InstallUtil.exe WindowsServiceTest.exe

InstallUtil存在路徑爲:C:\WINDOWS\Microsoft.NET\Framework\.NET版本號

複製C:\WINDOWS\Microsoft.Net\Framework\版本號  路徑中的InstallUtil.exe 到bin/debug或bin/release文件夾中,在命令行窗口中直接運行命令

InstallUtil.exe WindowsServiceTest.exe,在系統中註冊這個服務,使它創建一個合適的註冊項,以下圖:

而後再window服務列表中,啓動hjpServiceTest服務

卸載window 服務

命令:InstallUtil.exe WindowsServiceTest.exe /u

若是修改這個服務,可是路徑沒有變化的話是不須要從新註冊服務的,直接中止服務,而後用新的文件覆蓋原來的文件便可,若是路徑發生變化,應該先卸載這個服務,而後從新安裝這個服務。

 

------------------------------------------------------------------------------------------------------

Window服務應用程序體系結構

.net framework對windows服務提供了更多的支持,在命名空間System.ServiceProcess下.

包括類以下:

ServiceBase 全部Window服務的基類

ServiceController 該類的一個實例表明一個具體的windows服務

ServiceControllerPermission 用於控制ServiceController的使用權限

ServiceInstaller 用於執行對windows服務的安裝

ServiceProcessInstaller 用於執行對windows服務的安裝,與上類的不一樣的是,該類能夠表明一個能夠執行的windows服務的進程.

 

ServiceBase類

ServiceBase方法:

方法

描述

Run()

運行一個windows服務

OnContinue()

繼續執行服務

OnCustomCommand()

向windows服務發出自定指令

OnPause()

暫停正在運行的windows服務

OnPowerEvent()

當計算機的電源狀態改變是調用

OnShutDown()

當系統關閉條用OnStart()開始一個windows服務

OnStop()

結束一個windows服務

 ServiceBase屬性:

屬性

描述

AutoLog

表示是否將開始,結束,暫停,繼續等指令寫入事件日誌

CanHandlePowerEvent

表示該服務是否支持電源事件

CanPauseAndContinue

表示該服務是否支持暫停和繼續功能

CanShutDown

表示該服務是否支持關閉功能

CanStop

表示該服務是否支持結構功能

EventLog

應用程序的時間日誌

ServiceName

該服務名稱

 

 

 

 

 

 

 

 

 

 

 

 

 

 ServiceController類

服務控制類,用於控制windows服務的各類具體行爲,它既能夠控制本地的windows服務,有能夠控制遠程的windows服務。

ServiceControler的方法:

方法

描述

GetDivices()

獲得一臺計算機上設備驅動器服務

GetServices()

獲得一臺計算上的非設備驅動器服務

Close()

用於斷開服務鏈接,而且釋放服務控制器所佔用的資源

Continue()

繼續被暫停的服務

ExcuteCommand()

對服務執行一條自定義命令

Pause()

暫停服務

Refresh()

對全部屬性更新

Start()

啓動服務

Stop()

中止服務

WaitForStatus()

等待服務到達指定的狀態

 

 

ServiceController屬性

屬性 描述
CanPauseAndContinue 表示服務是否能夠中止
CanShutDown 表示服務在系統關閉時是否能夠獲得通知,CanStop表示服務器是否能夠被中止
DependentServices 表示與服務相關聯的設備
DisplayName 表示服務控制器所綁定的名稱
MachineName 表示服務所在的計算機名稱
ServiceName 表示綁定的服務名稱
ServiceType 表示控制器所引用的服務類型
ServicesDependedOn 表示服務所依賴ude服務集合Status表示控制器所引用的服務狀態

 

 

 

 

 

 

 

 

ServiceInstaller類

ServiceInstaller的屬性

屬性 描述
DisplayName 顯示名稱
ServiceName 表示服務名稱,這個名稱必須與Installer將要安裝的windows服務名稱相同
ServiceDependOn 服務所要用到的其服務名稱的一個數組
StartType 表示所安裝服務的啓動特性,能夠爲Automatic,Manual或Disable,默認爲Manual

 

 

 

 

 
 
ServiceInstaller事件
方法 事件
AfterInstaller() 調用Install方法後發生
AfterRollback() 調用Rollback後發生
AfterUninstall() 調用Uninstall方法後發生
BeforeInstall() 調用Install方法前發生
BeforeRollback() 調用Rollback方法前發生
BeforeUninstall() 調用Uninstall方法前發生
Committed() 調用Commit方法後發生
Committing() 調用Commit方法前發生
 
 
 
 
 
 
 

 

 

 

ServiceProcessInstaller類

用於安裝ServiceBase繼承的windows服務,它與一個可執行程序中的全部服務所作基本工做相同

ServiceProcessInstaller屬性

屬性 描述
Account 運行服務的當前用戶帳號
HelpText 在服務安裝選項中給出的幫助信息
Password 運行服務的當前帳號密碼
UserName 運行服務的當前帳號用戶名

 

 

 

 

 

------------------------------------------------------------------------------------------------------------------------

Windows服務調試

 

vs打開MySerivceLog項目

在管理工具-〉服務裏面啓動MyServiceLog服務

單擊vs的調試 -〉附加到進程,以下圖

 

 

在"可用進程「列表中,選中你要調式的服務的可執行文件名

單擊 」附加「按鈕,便可進入調試狀態

在timer1_Elapsed方法裏設置一個斷點,而後等它執行,服務執行到該處時候會自動啓動斷點。

 

相關文章
相關標籤/搜索