創建第一個windows服務


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

計算機啟動時,服務會自動開始運行,他們不要用戶一定登陸才運行。

可以通過選擇菜單“開始”-〉“控制面板”-〉“管理工具”-〉“服務”來查看現有系統中的服務,如下圖:

創建一個windows服務

切換到代碼視圖修改.

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方法,添加自己的邏輯代碼.

 

將服務程序hjpServiceTest.cs 切換到視圖模式,用鼠標右鍵單擊設計視圖選擇“添加安裝程序”選項,此后在項目中自動增加了一個ProjectInstaller.cs,

如下圖

 

打開ProjectInstaller,修改serviceInstaller1組件屬性

 

Description= 我的服務備注                       服務備注說明

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方法里設置一個斷點,然后等它執行,服務執行到該處時候會自動啟動斷點。

 

 


免責聲明!

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



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