サービス アプリケーションのプログラミング アーキテクチャ

Note

この記事は、.NET のホステッド サービスには適用されません。 Microsoft.Extensions.Hosting.BackgroundService を使用した Windows サービスの最新のコンテンツと Worker サービス テンプレートについては、次を参照してください:

Windows サービス アプリケーションは、System.ServiceProcess.ServiceBase クラスから継承するクラスが基になっています。 このクラスのメソッドをオーバーライドして機能を定義し、サービスの動作を決定します。

サービスの作成に関連する主要なクラスは次のとおりです。

さらに、ServiceController という名前のクラスを使って、サービス自体を操作できます。 このクラスは、サービスの作成には含まれませんが、サービスを開始および停止し、サービスにコマンドを渡し、サービスから一連の列挙値を戻すために使用できます。

サービスの動作の定義

サービス クラスにおいて、サービス コントロール マネージャー内でサービスの状態が変更されたときの動作を決定する基底クラスの関数をオーバーライドします。 ServiceBase クラスで公開されている以下のメソッドをオーバーライドして、カスタム動作を追加できます。

メソッド オーバーライドの目的
OnStart サービスが実行を開始するときに行う必要のあるアクションを示します。 サービスが意味のある処理を実行するには、このプロシージャにコードを記述する必要があります。
OnPause サービスが一時停止されるときに行う必要があることを示します。
OnStop サービスが実行を停止するときに行う必要があることを示します。
OnContinue サービスが一時停止後に正常な機能を再開するときに行う必要があることを示します。
OnShutdown システムがシャットダウンする時点でサービスが実行している場合に、シャットダウンの直前に行う必要があることを示します。
OnCustomCommand サービスがカスタム コマンドを受け取ったときに行う必要があることを示します。 カスタム コマンドについて詳しくは、MSDN オンラインをご覧ください。
OnPowerEvent バッテリ低下や中断操作など、電源管理イベントを受信したときのサービスの応答方法を示します。

注意

これらのメソッドは、サービスがその有効期間内に通過する状態を表しています。サービスは、ある状態から次の状態に遷移します。 たとえば、OnStart が呼び出される前の OnContinue コマンドにサービスが応答することはありません。

他にも、注目する必要のあるプロパティとメソッドがいくつかあります。 次の設定があります。

  • ServiceBase クラスの Run メソッド。 このメソッドは、サービスのメイン エントリ ポイントです。 Windows サービス テンプレートを使ってサービスを作成するときは、アプリケーションの Main メソッドに、サービスを実行するコードを挿入します。 このコードは次のようになります。

    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[]
        { new Service1() };
    Run(ServicesToRun);
    
    Dim ServicesToRun() As System.ServiceProcess.ServiceBase
    ServicesToRun =
        New System.ServiceProcess.ServiceBase() {New Service1()}
    System.ServiceProcess.ServiceBase.Run(ServicesToRun)
    

    注意

    これらの例では、アプリケーションに含まれる各サービスを追加できる ServiceBase 型の配列を使用しており、すべてのサービスを一緒に実行できます。 一方、作成するサービスが 1 つのみの場合は、配列は使わず、ServiceBase から継承する新しいオブジェクトを単純に宣言して、それを実行します。 例については、「方法: プログラムでサービスを作成する」を参照してください。

  • ServiceBase クラスの一連のプロパティ。 これらは、サービスで呼び出すことができるメソッドを決定します。 たとえば、CanStop プロパティを true に設定すると、サービスで OnStop メソッドを呼び出すことができます。 CanPauseAndContinue プロパティが true に設定されていると、OnPause および OnContinue メソッドを呼び出すことができます。 これらのプロパティのいずれかを true に設定するときは、関連するメソッドをオーバーライドして処理を定義する必要があります。

    注意

    サービスが役に立つためには、少なくとも OnStartOnStop をオーバーライドする必要があります。

また、ServiceController コンポーネントを使うと、既存のサービスと通信して、その動作を制御できます。

関連項目