本主題中的步驟引導您完成建立簡單的向事件記錄寫入訊息的 Windows 服務應用程式的過程。建立和使用服務所執行的基本步驟包括:
使用“Windows 服務”應用程式模板建立項目。此模板為您建立一個從 ServiceBase 繼承的類,並編寫大量基本服務代碼,例如啟動服務的代碼。
編寫 OnStart 和 OnStop 過程的代碼,並重寫要重新定義的任何其他方法。
添加服務應用程式所必要安裝程式。預設情況下,當單擊“添加安裝程式”連結時,一個包含兩個或多個安裝程式的類將被添加到應用程式中:一個用於安裝進程,其他安裝程式中的每一個用於項目包含的每個關聯服務。
產生您的項目。
建立安裝項目以安裝服務,然後進行安裝。
訪問 Windows 2000 服務控制管理員並啟動您的服務。
首先,建立項目並設定服務正常運行所必需的值。
建立服務
建立並佈建服務
在[檔案] 功能表上單擊“建立項目”。
開啟“建立項目”對話方塊。
在 Visual Basic、Visual C#、Visual C++ 或 Visual J# 項目模板的列表中選擇“Windows 服務”項目,並將其命名為 MyNewService。單擊“確定”。
注意 |
項目模板自動添加從 System.ServiceProcess.ServiceBase 繼承的名為 Service1 的組件類。 |
單擊設計器選擇 Service1。然後,在“屬性”視窗中,將 Service1 的 ServiceName 和“(名稱)”屬性設定為“MyNewService”。
將 AutoLog 屬性設定為 true。
在“視圖”菜單中單擊“代碼”以開啟“代碼編輯器”。編輯 Main 方法以建立“MyNewService”的執行個體。當在步驟 3 中重新命名服務時,未在 Main 方法中修改類名。在 Visual C# 和 Visual J# 應用程式中,Main 方法分別位於 Program.cs 和 Program.js 檔案中。
Visual Basic 複製代碼
' To access the Main method in Visual Basic, select Main from the' method name drop-down list. This expands the Component Designer ' generated code region.Shared Sub Main() Dim ServicesToRun() As System.ServiceProcess.ServiceBase ' Change the following line to match. ServicesToRun = New System.ServiceProcess.ServiceBase() _ {New MyNewService()} System.ServiceProcess.ServiceBase.Run(ServicesToRun)End Sub
C# 複製代碼
static void Main(){ System.ServiceProcess.ServiceBase[] ServicesToRun; // Change the following line to match. ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyNewService() }; System.ServiceProcess.ServiceBase.Run(ServicesToRun);}
J# 複製代碼
public static void main(String[] args){ System.ServiceProcess.ServiceBase[] ServicesToRun; ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyNewService() }; System.ServiceProcess.ServiceBase.Run(ServicesToRun);}
向服務添加功能
在下一節中,您將把自訂事件記錄添加到 Windows 服務中。事件記錄與 Windows 服務沒有任何形式的關聯。此處,EventLog 組件用作可以添加到 Windows 服務的組件類型的樣本。有關自訂事件記錄的更多資訊,請參見 如何:建立和移除自訂事件記錄。
將自訂事件記錄功能添加到服務中
在“方案總管”中,右擊“Service1.vb”、“Service1.cs”或“Service1.jsl”,並選擇“視圖設計器”。
從“工具箱”的“組件”選項卡,將 EventLog 組件拖到設計器中。
在“方案總管”中,右擊“Service1.vb”、“Service1.cs”或“Service1.jsl”,並選擇“查看代碼”。
編輯建構函式以定義一個使用者事件記錄。
Visual Basic 複製代碼
' To access the constructor in Visual Basic, select New from the' method name drop-down list. Public Sub New() MyBase.New() InitializeComponent() If Not System.Diagnostics.EventLog.SourceExists("MySource") Then System.Diagnostics.EventLog.CreateEventSource("MySource", _ "MyNewLog") End If EventLog1.Source = "MySource" EventLog1.Log = "MyNewLog"End Sub
C# 複製代碼
public MyNewService(){ InitializeComponent(); if (!System.Diagnostics.EventLog.SourceExists("MySource")) { System.Diagnostics.EventLog.CreateEventSource( "MySource","MyNewLog"); } eventLog1.Source = "MySource"; eventLog1.Log = "MyNewLog";}
J# 複製代碼
public MyNewService(){ InitializeComponent(); if (!System.Diagnostics.EventLog.SourceExists("MySource")) { System.Diagnostics.EventLog.CreateEventSource( "MySource", "MyNewLog"); } eventLog1.set_Source("MySource"); eventLog1.set_Log("MyNewLog");}
定義當服務啟動時發生的情況
在代碼編輯器中,找到建立項目時被自動重寫的 OnStart 方法,並編寫代碼來確定當服務開始運行時發生的情況:
Visual Basic 複製代碼
' To access the OnStart in Visual Basic, select OnStart from the' method name drop-down list. Protected Overrides Sub OnStart(ByVal args() As String) EventLog1.WriteEntry("In OnStart")End Sub
C# 複製代碼
protected override void OnStart(string[] args){ eventLog1.WriteEntry("In OnStart");}
J# 複製代碼
protected void OnStart(String[] args){ eventLog1.WriteEntry("In OnStart");}
注意 |
服務應用程式設計為長時間運行。因此,它通常輪詢或監視系統中的情況。監視是在 OnStart 方法中設定的。但是,OnStart 實際上不進行監視。一旦服務的操作開始,OnStart 方法必須返回到作業系統。它不能始終迴圈或阻止。若要設定簡單的輪詢機制,可以使用 System.Timers.Timer 組件。在 OnStart 方法中,可以設定組件上的參數,然後將 Enabled 屬性設定為 true。然後,計時器將在代碼中周期性地引發事件,此時,服務可以進行其監視工作。 |
定義當服務停止時發生的情況
在“代碼編輯器”中,從“方法名稱”下拉式清單中選擇 OnStop 過程,該過程是建立項目時自動重寫的。編寫代碼以確定服務停止時發生的情況:
Visual Basic 複製代碼
Protected Overrides Sub OnStop() EventLog1.WriteEntry("In OnStop.")End Sub
C# 複製代碼
protected override void OnStop(){ eventLog1.WriteEntry("In onStop.");}
J# 複製代碼
protected void OnStop(){ eventLog1.WriteEntry("In onStop.");}
還可以重寫 OnPause、OnContinue 和 OnShutdown 方法來定義對組件的進一步處理。
定義服務的其他動作
對於要處理的方法,重寫適當的方法並定義要發生的操作。
下面的代碼顯示重寫 OnContinue 方法時代碼的情況:
Visual Basic 複製代碼
Protected Overrides Sub OnContinue() EventLog1.WriteEntry("In OnContinue.")End Sub
C# 複製代碼
protected override void OnContinue(){ eventLog1.WriteEntry("In OnContinue.");}
J# 複製代碼
protected void OnContinue(){ eventLog1.WriteEntry("In OnContinue.");}
安裝 Windows 服務時需要執行某些自訂動作,這可以由 Installer 類來完成。Visual Studio 可以專門為 Windows 服務建立這些安裝程式並將它們添加到項目中。
為服務建立安裝程式
在“方案總管”中,右擊“Service1.vb”、“Service1.cs”或“Service1.jsl”,並選擇“視圖設計器”。
單擊設計器的背景以選擇服務本身,而不是它的任何內容。
設計器具有焦點時,右擊然後單擊“添加安裝程式”。
預設情況下,向您的項目添加包含兩個安裝程式的組件類。將該組件命名為 ProjectInstaller,它包含的安裝程式分別是服務的安裝程式和服務關聯進程的安裝程式。
在“ProjectInstaller”的“設計”視圖中,單擊“ServiceInstaller1”或“serviceInstaller1”。
在“屬性”視窗中,將 ServiceName 屬性設定為“MyNewService”。
將 StartType 屬性設定為 Automatic。
在設計器中單擊“ServiceProcessInstaller1”(對於 Visual Basic 項目)或“serviceProcessInstaller1”(對於 Visual C# 或 Visual J# 項目)。將 Account 屬性設定為 LocalService。這將使得在本地服務帳戶上安裝和運行該服務。
安全注意 |
LocalService 帳戶用作本機電腦上的非特權使用者,向任何遠程伺服器顯示匿名憑據。使用其他帳戶時需要特別小心,因此它們具有較高的特權,會增加您受到惡意代碼攻擊的風險。 |
產生服務項目
在“方案總管”中,右擊選擇您的項目並從捷徑功能表中選擇“屬性”。出現項目的“屬性設計器”。
從“應用程式”頁的“啟始物件”列表中選擇“MyNewService”。
按 Ctrl+Shift+B 產生項目。
產生項目後,便可以對其進行部署了。安裝項目將安裝已編譯的專案檔並運行要運行 Windows 服務所需的安裝程式。若要建立完整的安裝項目,您需要將項目輸出 MyNewService.exe 添加到安裝項目,然後添加自訂動作來安裝 MyNewService.exe。有關安裝項目的更多資訊,請參見 安裝項目。有關自訂動作的更多資訊,請參見 演練:建立自訂動作。
為服務建立安裝項目
在“方案總管”中,右擊選擇解決方案,指向“添加”,然後單擊“建立項目”。
在“項目類型”窗格中選擇“安裝和部署項目”檔案夾。
在“模板”窗格中選擇“安裝項目”。將項目命名為 MyServiceSetup。單擊“確定”。
安裝項目隨即添加到解決方案。
然後,將 Windows 服務項目的輸出 MyNewService.exe 添加到安裝項目中。
向安裝項目添加 MyNewService.exe
在“方案總管”中,右擊“MyServiceSetup”,指向“添加”,然後選擇“項目輸出”。
出現“添加項目輸出組”對話方塊。
並且在“項目”框中選擇了“MyNewService”。
在列表框中,選擇“主輸出”,再單擊“確定”。
MyNewService 的主輸出的項目項被添加到安裝項目中。
現在添加自訂動作以安裝 MyNewService.exe 檔。
向安裝項目添加自訂動作
在“方案總管”中右擊安裝項目,指向“視圖”,再選擇“自訂動作”。
出現“自訂動作”編輯器。
在“自訂動作”編輯器中右擊“自訂動作”節點,再選擇“添加自訂動作”。
出現“選擇項目中的項”對話方塊。
在列表框中雙擊“應用程式檔案夾”以將其開啟,選擇“MyNewService 的主輸出(活動)”,再單擊“確定”。
主輸出被添加到自訂動作的所有四個節點:“安裝”、“提交”、“復原”和“卸載”。
在“方案總管”中,右擊“MyServiceSetup”項目並選擇“產生”。
安裝 Windows 服務
若要安裝“MyNewService.exe”,請右擊“方案總管”中的安裝項目,再選擇“安裝”。
完成“安裝嚮導”中的步驟。產生並儲存您的解決方案。
啟動和停止服務
通過執行下列操作之一開啟服務控制管理員:
現在應該看到“MyNewService”列在視窗的“服務”地區中。
從列表中選擇您的服務,右擊該服務,然後單擊“啟動”。
右擊該服務,再單擊“停止”。
驗證服務的事件記錄輸出
開啟“伺服器總管”並訪問“事件記錄”節點。有關更多資訊,請參見 如何:在伺服器總管中使用事件記錄。
注意 |
Visual Studio 標準版中不提供“Windows 服務”模板及相關功能。有關更多資訊,請參見 Visual Studio 版本。 |
找到 MyNewLog 的列表並展開它。您應該看到服務所執行操作的項。
卸載服務
在“開始”菜單上開啟“控制台”並單擊“添加/刪除程式”,再找到您的服務並單擊“卸載”。
還可以通過右擊 .msi 檔案的程式表徵圖並選擇“卸載”來卸載該程式。
注意 |
如果在 Windows 2000 上安裝了服務,則需要重新啟動系統才能重新安裝服務。在 Windows 2000 中,服務在系統重新啟動之前不會完全刪除。 |
後續步驟
可以利用 ServiceController 組件將命令發送到已安裝的服務。有關使用 ServiceController 控制項的更多資訊,請參見 監視 Windows 服務。
可以在安裝應用程式時使用安裝程式建立事件記錄,而不是在運行應用程式時建立事件記錄。此外,在卸載應用程式時,事件記錄將被安裝程式刪除。有關更多資訊,請參見 演練:安裝事件記錄組件。