2008年6月16日 星期一

Visual Studio 程式設計人員手冊 - .NET Framework 逐步解說:在元件設計工具中建立 Windows 服務應用程式

注意事項

在 Visual Studio 的標準版中,不能使用 [Windows 服務] 範本和相關的功能。如需詳細資訊,請參閱 Visual Studio 的版本

此主題中的程序將逐步帶領您建立將訊息寫入事件記錄檔的簡單 Windows 服務應用程式。您執行來建立和使用服務的基本步驟包含:

  • 使用 [Windows 服務] 應用程式範本來建立專案。這個範本會為您建立繼承自 ServiceBase 的類別,並且撰寫大部分的基本服務程式碼,例如啟動服務的程式碼。##ReadMore##

    撰寫 OnStartOnStop 程序的程式碼,並且覆寫任何要重新定義的其他方法。

  • 為服務應用程式加入必要的安裝程式。根據預設,當您按一下 [加入安裝程式] 連結,會將包含兩個或多個安裝程式的類別加入至應用程式中:一個是用來安裝處理序 (Process),而另一個則是用於專案所包含的每一個相關服務。

  • 建置您的專案。

  • 建立安裝專案來安裝您的服務,接著進行安裝。

  • 存取 Windows 2000 服務控制管理員,並啟動您的服務。

若要開始,您需要建立專案並設定服務正常運作所需的值。

建立服務

若要建立和設定您的服務

  1. 在 [檔案] 功能表上,按一下 [新增專案]。

    [新增專案] 對話方塊隨即開啟。

  2. 從 Visual Basic、Visual C#、Visual C++,或 Visual J# 專案範本清單中,選取 [Windows 服務] 專案,接著將其命名為 MyNewService。按一下 [確定]。

    注意事項

    專案範本會自動加入繼承自 System.ServiceProcess.ServiceBase 且名稱為 Service1 的元件類別。

  3. 按一下設計工具,選取 Service1。然後,在 [屬性] 視窗中,將 Service1ServiceName 和 [(名稱)] 名稱屬性設定為 MyNewService

  4. AutoLog 屬性設定為 true

  5. 在 [檢視] 功能表上按一下 [程式碼],開啟程式碼編輯器。編輯 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
    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);
    }
    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 服務之元件類型的範例。如需自訂事件記錄檔的詳細資訊,請參閱 HOW TO:建立及移除自訂事件記錄檔

若要將自訂事件記錄檔功能加入您的服務中

  1. 在 [方案總管] 中,在 [Service1.vb]、[Service1.cs] 或 [Service1.jsl] 上按一下滑鼠右鍵,然後選取 [檢視表設計工具]。

  2. 從 [工具箱] 的 [元件] 索引標籤中,將 EventLog 元件拖曳至設計工具中。

  3. 在 [方案總管] 中,在 [Service1.vb]、[Service1.cs] 或 [Service1.jsl] 上按一下滑鼠右鍵,然後選取 [檢視程式碼]。

  4. 編輯建構函式 (Constructor) 定義自訂事件記錄檔。

    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
    public MyNewService()
    {
    InitializeComponent();
    if (!System.Diagnostics.EventLog.SourceExists("MySource"))
    {
    System.Diagnostics.EventLog.CreateEventSource(
    "MySource","MyNewLog");
    }
    eventLog1.Source = "MySource";
    eventLog1.Log = "MyNewLog";
    }
    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
    protected override void OnStart(string[] args)
    {
    eventLog1.WriteEntry("In OnStart");
    }
    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
    protected override void OnStop()
    {
    eventLog1.WriteEntry("In onStop.");
    }
    protected void OnStop()
    {
    eventLog1.WriteEntry("In onStop.");
    }

您也可以覆寫 OnPauseOnContinueOnShutdown 方法,為元件定義進一步的處理方式。

若要為服務定義其他動作

  • 針對您要處理的方法,覆寫適當的方法並定義您希望發生的動作。

    下列程式碼會顯示您覆寫 OnContinue 方法的情況:

    Visual Basic
    Protected Overrides Sub OnContinue()
    EventLog1.WriteEntry("In OnContinue.")
    End Sub
    protected override void OnContinue()
    {
    eventLog1.WriteEntry("In OnContinue.");
    }
    protected void OnContinue()
    {
    eventLog1.WriteEntry("In OnContinue.");
    }

在安裝 Windows 服務時,需要執行一些自訂動作,這可由 Installer 類別進行。Visual Studio 可建立專供 Windows 服務使用的安裝程式,並將它們加入至您的專案。

若要為您的服務建立安裝程式

  1. 在 [方案總管] 中,在 [Service1.vb]、[Service1.cs] 或 [Service1.jsl] 上按一下滑鼠右鍵,然後選取 [檢視表設計工具]。

  2. 按一下設計工具的背景 (Background) 來選取服務本身,而不是它的內容。

  3. 設計工具取得焦點時,以滑鼠右鍵按一下,再按 [加入安裝程式]。

    依預設會將包含兩個安裝程式的元件類別加入您的專案中。元件命名為 ProjectInstaller,而其所包含的安裝程式分別為服務的安裝程式和服務相關處理序的安裝程式。

  4. 在 [ProjectInstaller] 的 [設計] 檢視中,按一下 [ServiceInstaller1] 或 [serviceInstaller1]。

  5. 請在 [屬性] 視窗中,將 ServiceName 屬性設定為 MyNewService

  6. StartType 屬性設定為 Automatic

  7. 在設計工具中,按一下 [ServiceProcessInstaller1] (針對 Visual Basic 專案) 或 [serviceProcessInstaller1] (針對 Visual C# 和 Visual J# 專案)。將 Account 屬性設定為 LocalService。如此會使服務安裝並在本機服務帳戶上執行。

    安全性 注意事項

    LocalService 帳戶做為本機電腦上沒有權限的使用者,而且提供對任何遠端伺服器的匿名認證。謹慎使用其他帳戶,因為這些帳戶與更高的權限執行會增加您遭受惡意程式碼攻擊的風險。

若要建置您的服務專案

  1. 在 [方案總管] 中,按一下滑鼠右鍵選取專案,然後從快速鍵功能表中選取 [屬性]。專案的 [屬性設計工具] 隨即出現。

  2. 在 [應用程式] 頁的 [啟始物件] 清單中,選擇 [MyNewService]。

  3. 按 CTRL+SHIFT+B 以建置專案。

既然已建置專案,您就可部署它。安裝專案會安裝編譯過的專案檔,並執行啟動 Windows 應用程式所需的安裝程式。若要建立完整的安裝專案,您必須將專案輸出 MyNewService.exe 加入至安裝專案,然後加入自訂動作安裝 MyNewService.exe。如需安裝專案的詳細資訊,請參閱安裝專案。如需自訂動作的詳細資訊,請參閱逐步解說:建立自訂動作

若要為您的服務建立安裝專案

  1. 在 [方案總管] 中,按一下滑鼠右鍵選取方案,指向 [加入],再按一下 [新增專案]。

  2. 在 [專案類型] 窗格中,選取 [安裝和部署專案] 資料夾。

  3. 在 [範本] 窗格中,選取 [安裝專案]。將專案命名為 MyServiceSetup。按一下 [確定]。

    接著就會將安裝專案加入方案。

接下來您會將 Windows 服務專案的輸出 MyNewService.exe,加入至安裝專案。

若要將 MyNewService.exe 加入至安裝專案

  1. 在 [方案總管] 中,以滑鼠右鍵按一下 [MyServiceSetup]、指向 [加入],然後選擇 [專案輸出]。

    [加入專案輸出群組] 對話方塊隨即出現。

  2. [專案] 方塊中會選取 [MyNewService]。

  3. 從清單方塊中選取 [主要輸出],然後按一下 [確定]。

    接著就會將 MyNewService 的主要輸出專案項目加入至安裝專案中。

現在要加入自訂動作來安裝 MyNewService.exe 檔。

若要將自訂動作加入安裝專案中

  1. 在 [方案總管] 中,在安裝專案上按一下滑鼠右鍵,指向 [檢視],然後按一下 [自訂動作]。

    [自訂動作] 編輯器隨即出現。

  2. 在 [自訂動作] 編輯器中,在 [自訂動作] 節點上按一下滑鼠右鍵,然後選擇 [加入自訂動作]。

    [選取專案中項目] 對話方塊隨即出現。

  3. 按兩下清單方塊中的 [應用程式資料夾] 來開啟它,選取 [來自 MyNewService 的主要輸出 (作用中)] 並按一下 [確定]。

    主要輸出會加入至自訂動作的所有四個節點,[安裝]、[認可]、[復原] 及 [解除安裝]。

  4. 在 [方案總管] 中的 [MyServiceSetup] 專案上按一下滑鼠右鍵,並按一下 [建置]。

若要安裝 Windows 服務

  1. 若要安裝 MyNewService.exe,請在 [方案總管] 的安裝專案上按一下滑鼠右鍵,然後選取 [安裝]。

  2. 執行安裝精靈所示的步驟。建置並儲存方案。

若要啟動和停止您的服務

  1. 執行下列步驟開啟服務控制管理員:

    • 在 Windows XP 和 2000 Professional 中,在桌面的 [我的電腦] 上按一下滑鼠右鍵,再按一下 [管理]。在 [電腦管理] 主控台 (Console) 中,展開 [服務及應用程式] 節點。

      -或-

    • 在 Windows Server 2003 和 Windows 2000 Server 中,按一下 [開始],指向 [程式集],按一下 [系統管理工具],然後按一下 [服務]。

      注意事項

      在 Windows NT 4.0 版中,您可以從 [控制台] 中開啟這個對話方塊。

    現在您應該可以看到 MyNewService 列在這個視窗的 [服務] 區段中。

  2. 從清單中選取您的服務,以滑鼠右鍵按一下該服務,再按一下 [啟動]。

  3. 在服務上按一下滑鼠右鍵,再按一下 [停止]。

若要確認服務的事件記錄檔輸出

  1. 開啟 [伺服器總管] 並存取 [事件記錄檔] 節點。如需詳細資訊,請參閱 HOW TO:在伺服器總管中使用事件記錄檔

    注意事項

    在 Visual Studio 的標準版中,不能使用 [Windows 服務] 範本和相關的功能。如需詳細資訊,請參閱 Visual Studio 的版本

  2. 找出 MyNewLog 的清單並展開。這時您應看到服務已執行的動作項目。

若要解除服務的安裝

  1. 在 [開始] 功能表上,開啟 [控制台] 並按一下 [新增或移除程式],然後找出您的服務,並按一下 [解除安裝]。

  2. 您也可以在 .msi 檔案的程式圖示上按一下滑鼠右鍵,並選取 [解除安裝],以解除程式的安裝。

    注意事項

    如果在 Windows 2000 上安裝服務,在重新安裝服務前必須先讓系統重新開機。在 Windows 2000 中,系統重新開機後才會完全刪除服務。

後續步驟

您可以瀏覽 ServiceController 元件的用法,讓您可以將命令傳送至已安裝的服務。如需使用 ServiceController 元件的詳細資訊,請參閱監視 Windows 服務

您可以使用安裝程式,在安裝應用程式時建立事件記錄檔,而不是在應用程式執行時才建立事件記錄檔。此外在應用程式解除安裝時,安裝程式會刪除事件記錄檔。如需詳細資訊,請參閱逐步解說:安裝事件記錄檔元件