http://msdn.microsoft.com/zh-cn/library/zt39148a(v=vs.80).aspx
演練:在組件設計器中創建 Windows 服務應用程序

?
![]() |
---|
Visual Studio 標準版中不提供“Windows 服務”模板及相關功能。有關更多信息,請參見?Visual Studio 版本。 |
本主題中的步驟引導您完成創建簡單的向事件日志寫入消息的 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 文件中。
C#VBstatic 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”,并選擇“查看代碼”。
-
編輯構造函數以定義一個用戶事件日志。
C#VBpublic 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?方法,并編寫代碼來確定當服務開始運行時發生的情況:
C#VBprotected 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?過程,該過程是創建項目時自動重寫的。編寫代碼以確定服務停止時發生的情況:
C#VBprotected override void OnStop() {eventLog1.WriteEntry("In onStop."); }
J#protected void OnStop() {eventLog1.WriteEntry("In onStop."); }
還可以重寫?OnPause、OnContinue?和?OnShutdown?方法來定義對組件的進一步處理。
定義服務的其他操作
-
對于要處理的方法,重寫適當的方法并定義要發生的操作。
下面的代碼顯示重寫?OnContinue?方法時代碼的情況:
C#VBprotected 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”,請右擊“解決方案資源管理器”中的安裝項目,再選擇“安裝”。
-
完成“安裝向導”中的步驟。生成并保存您的解決方案。
啟動和停止服務
-
通過執行下列操作之一打開服務控制管理器:
-
在 Windows XP 和 2000 專業版中,在桌面上右擊“我的電腦”,再單擊“管理”。在“計算機管理”控制臺中,展開“服務和應用程序”節點。
- 或 -
-
在 Windows Server 2003 和 Windows 2000 Server 中,單擊“開始”,指向“程序”,單擊“管理工具”,然后單擊“服務”。
注意
在 Windows NT 4.0 版中,可以從“控制面板”中打開此對話框。
現在應該看到“MyNewService”列在窗口的“服務”區域中。
-
-
從列表中選擇您的服務,右擊該服務,然后單擊“啟動”。
-
右擊該服務,再單擊“停止”。
驗證服務的事件日志輸出
-
打開“服務器資源管理器”并訪問“事件日志”節點。有關更多信息,請參見?如何:在服務器資源管理器中使用事件日志。
注意
Visual Studio 標準版中不提供“Windows 服務”模板及相關功能。有關更多信息,請參見?Visual Studio 版本。
-
找到 MyNewLog 的列表并展開它。您應該看到服務所執行操作的項。
卸載服務
-
在“開始”菜單上打開“控制面板”并單擊“添加/刪除程序”,再找到您的服務并單擊“卸載”。
-
還可以通過右擊 .msi 文件的程序圖標并選擇“卸載”來卸載該程序。
注意
如果在 Windows 2000 上安裝了服務,則需要重新啟動系統才能重新安裝服務。在 Windows 2000 中,服務在系統重新啟動之前不會完全刪除。