次の方法で共有


チュートリアル : コンポーネント デザイナによる Windows サービス アプリケーションの作成

更新 : 2007 年 11 月

メモ :

Windows サービスのテンプレートおよび関連する機能は、Visual Studio の Standard Edition では使用できません。

このトピックでは、イベント ログにメッセージを書き込む単純な Windows サービス アプリケーションを作成する手順を示します。サービスを作成して使用するための基本的な手順は次のとおりです。

  • Windows サービス アプリケーション テンプレートを使用してプロジェクトを作成します。このテンプレートは、ServiceBase を継承するクラスを作成し、基本的なサービス コードの多く (サービスを開始するコードなど) を記述します。

  • OnStart プロシージャおよび OnStop プロシージャのコードを記述し、再定義が必要な他のすべてのメソッドをオーバーライドします。

  • サービス アプリケーションの必要なインストーラを追加します。既定では、[インストーラの追加] リンクをクリックしたときに、複数のインストーラを含むクラスが、プロセスのインストール用に 1 つ、プロジェクトに含まれる関連サービスごとに 1 つずつ、アプリケーションに追加されます。

  • プロジェクトをビルドします。

  • サービスをインストールするセットアップ プロジェクトを作成し、サービスをインストールします。

  • Windows 2000 サービス コントロール マネージャにアクセスし、サービスを開始します。

最初に、プロジェクトを作成し、サービスが正しく機能するために必要な値を設定します。

メモ :

お使いのマシンで、Visual Studio ユーザー インターフェイスの一部の要素の名前や場所が、次の手順とは異なる場合があります。これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。詳細については、「Visual Studio の設定」を参照してください。

サービスの作成

サービスを作成して設定するには

  1. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。

    [新しいプロジェクト] ダイアログ ボックスが表示されます。

  2. Visual Basic、Visual C#、Visual C++、または Visual J# のプロジェクト テンプレートの一覧で、Windows サービス プロジェクトを選択し、「MyNewService」という名前を付けます。[OK] をクリックします。

    メモ :

    プロジェクト テンプレートは、System.ServiceProcess.ServiceBase を継承する Service1 という名前のコンポーネント クラスを自動的に追加します。

  3. デザイナをクリックして Service1 を選択します。その後、[プロパティ] ウィンドウで Service1 の [ServiceName] プロパティと [(Name)] プロパティを MyNewService に設定します。

  4. [AutoLog] プロパティを true に設定します。

  5. [表示] メニューの [コード] をクリックしてコード エディタを開きます。Main メソッドを編集して、MyNewService のインスタンスを作成するようにします。手順 3 でサービスの名前を変更したときに、Main メソッド内のクラス名は変更されません。Visual C# アプリケーションおよび Visual J# アプリケーションの Main メソッドは、それぞれ Program.cs ファイルと Program.js ファイルに存在します。

    ' 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 サービスとまったく関連付けられていません。ここでは、Windows サービスに追加できるコンポーネントの種類の例として、EventLog コンポーネントを使用しています。カスタム イベント ログの詳細については、「方法 : カスタム イベント ログを作成または削除する」を参照してください。

サービスにカスタム イベント ログ機能を追加するには

  1. ソリューション エクスプローラで Service1.vb、Service1.cs、または Service1.jsl を右クリックし、[デザイナの表示] をクリックします。

  2. ツールボックスの [コンポーネント] タブから、EventLog コンポーネントをデザイナにドラッグします。

  3. ソリューション エクスプローラで Service1.vb、Service1.cs、または Service1.jsl を右クリックし、[コードの表示] をクリックします。

  4. コンストラクタを編集して、カスタム イベント ログを定義します。

    ' 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 メソッドを探し、サービスが実行を開始したときに行う処理を決定するコードを記述します。

    ' 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 プロシージャを選択します。サービスが停止したときに行う処理を決定するコードを記述します。

    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.");
        }
    

また、OnPauseOnContinue、および OnShutdown の各メソッドをオーバーライドして、コンポーネントの処理をさらに定義することもできます。

サービスに対して他の処理を定義するには

  • 処理するメソッドに対して、適切なメソッドをオーバーライドし、実行する処理を定義します。

    OnContinue メソッドをオーバーライドしたときのコードの例を次に示します。

    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. デザイナの背景をクリックして、サービスの内容ではなくサービス自体を選択します。

  3. デザイナにフォーカスを置いた状態で右クリックし、[インストーラの追加] をクリックします。

    既定では、2 つのインストーラを含むコンポーネント クラスがプロジェクトに追加されます。このコンポーネントは 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」という名前を付けます。[OK] をクリックします。

    セットアップ プロジェクトがソリューションに追加されます。

次に、Windows サービス プロジェクトからの出力である MyNewService.exe をセットアップに追加します。

セットアップ プロジェクトに MyNewService.exe を追加するには

  1. ソリューション エクスプローラで、[MyServiceSetup] を右クリックし、[追加] をポイントします。次に、[プロジェクト出力] をクリックします。

    [プロジェクト出力グループの追加] ダイアログ ボックスが表示されます。

  2. [プロジェクト] ボックスでは、[MyNewService] が選択されています。

  3. 一覧の [プライマリ出力] をクリックし、[OK] をクリックします。

    MyNewService のプライマリ出力のプロジェクト項目がセットアップ プロジェクトに追加されます。

次に、MyNewService.exe ファイルをインストールするカスタム動作を追加します。

セットアップ プロジェクトにカスタム処理を追加するには

  1. ソリューション エクスプローラで、セットアップ プロジェクトを右クリックし、[表示] をポイントします。次に、[カスタム動作] をクリックします。

    カスタム動作エディタが表示されます。

  2. カスタム動作エディタで、[カスタム動作] ノードを右クリックし、[カスタム動作の追加] をクリックします。

    [プロジェクトから項目を選択] ダイアログ ボックスが表示されます。

  3. 一覧の [アプリケーション フォルダ] をダブルクリックして開き、[MyNewService (アクティブ) のプライマリ出力] をクリックし、[OK] をクリックします。

    カスタム動作の 4 つのノードすべて (Install、Commit、Rollback、Uninstall) にプライマリ出力が追加されます。

  4. ソリューション エクスプローラで、MyServiceSetup プロジェクトを右クリックし、[ビルド] をクリックします。

Windows サービスをインストールするには

  1. MyNewService.exe をインストールするには、ソリューション エクスプローラでセットアップ プロジェクトを右クリックし、[インストール] をクリックします。

  2. セットアップ ウィザードの手順に従って操作します。ソリューションをビルドし、保存します。

サービスを開始および停止するには

  1. サービス コントロール マネージャを次のいずれかの方法で開きます。

    • Windows XP および Windows 2000 Professional のデスクトップで、[マイ コンピュータ] を右クリックし、[管理] をクリックします。[コンピュータの管理] コンソールで、[サービスとアプリケーション] ノードを展開します。

      または

    • Windows Server 2003 および Windows 2000 Server では、[スタート] メニューの [プログラム] をポイントし、[管理ツール] をポイントして、[サービス] をクリックします。

      メモ :

      Windows NT Version 4.0 では、コントロール パネルからこのダイアログ ボックスを開くことができます。

    ウィンドウの [サービス] セクションの一覧に MyNewService が表示されます。

  2. 一覧で目的のサービスを右クリックし、[開始] をクリックします。

  3. サービスを右クリックし、[中止] をクリックします。

サービスのイベント ログ出力を検査するには

  1. サーバー エクスプローラを表示し、[イベント ログ] ノードにアクセスします。詳細については、「方法 : サーバー エクスプローラでイベント ログを使用する」を参照してください。

    メモ :

    Windows サービスのテンプレートおよび関連する機能は、Visual Studio の Standard Edition では使用できません。

  2. MyNewLog のリスティングを展開します。サービスが実行した処理に対するエントリが表示されます。

サービスをアンインストールするには

  1. [スタート] メニューの [コントロール パネル] をクリックし、[プログラムの追加と削除] をクリックします。アンインストールするサービスを選択し、[アンインストール] をクリックします。

  2. .msi ファイルのプログラム アイコンを右クリックして [アンインストール] をクリックしても、プログラムをアンインストールできます。

    メモ :

    Windows 2000 にサービスをインストールした場合は、サービスを再インストールする前にシステムを再起動する必要があります。Windows 2000 では、システムを再起動するまでサービスは完全に削除されません。

次の手順

インストールしたサービスにコマンドを送信するための ServiceController コンポーネントの使用法を調べることもできます。ServiceController コンポーネントの使用法の詳細については、「Windows サービスの監視」を参照してください。

インストーラを使用すると、アプリケーションの実行時にイベント ログを作成する代わりに、アプリケーションのインストール時にイベント ログを作成できます。さらに、イベント ログは、アプリケーションがアンインストールされたときにインストーラによって削除されます。詳細については、「チュートリアル : イベント ログ コンポーネントのインストール」を参照してください。

参照

処理手順

方法 : サービス アプリケーションにインストーラを追加する

方法 : サービスをインストールおよびアンインストールする

方法 : Windows サービス アプリケーションをデバッグする

方法 : サーバー エクスプローラからイベント ビューアを起動する

概念

Windows サービス アプリケーションの概要

参照

方法 : サーバー エクスプローラ/データベース エクスプローラにアクセスして初期化する

その他の技術情報

Windows サービス アプリケーション