初めて作る.NET WindowsサービスVisual Studio Magazine(2/7 ページ)

» 2005年02月01日 18時49分 公開
[Doug Thews,FTPOnline]

Windowsサービスを作る

 まずは、Windowsサービスプロジェクトの作成から始めよう。[ファイル]メニューから[新規作成]→[プロジェクト]を選択し、「Windowsサービス」のテンプレートを選ぶ。このサンプルでは、サービス名としてAppMonitorという名前を使うものとする。

 するとVisual Studio .NETによって、「AppMonitor.vb」というVB.NETのファイルを1つ含んだ新しいプロジェクトが作成される。このファイルをダブルクリックして、デザインビューを表示させる(画面1)。

画面1■Windowsサービスのプロジェクトを作成する。プロパティを設定することで、サービスがどのようなイベントに受け応えをするのかを定義する。AutoLogプロパティを有効にすることで、すべてのサービスイベントをWindowsのイベントログに記録するようにもできる

 この時、サービスプロジェクトに対していくつかのプロパティを設定できるという点に注目しよう。

 例えば、このサービスが[停止][一時停止][再開]、その他のイベントに応答するかどうかを設定できる。そして、AutoLogプロパティをTrueに設定すれば、[停止]や[開始]といったサービスイベントをWindowsのイベントログに記録することが可能だ。

 画面1は、AppMonitorサービスプロジェクトのプロパティページを示したものだ。

 さて、サービスのソースコードを見るために、“click here to switch to code view”というリンク(訳注:日本語版では「ここをクリックするとコードビューに切り替わります」)をクリックしよう。まず気づくのは、AppMonitorクラスは、System.ServiceProcess.ServiceBaseクラスから継承しているという点だ。この基底クラスは、サービスに対する定義やサービスとやりとりするのに必要となるすべてのイベントやプロパティを備えている。

 Visual Studio .NET 2003は、OSのブートプロセスによってサービスが最初に(実行ではなく)読み込まれた時に実行される、Mainサブルーチンのコードを生成する。

<MTAThread()> _
Shared Sub Main()
' サービスディレクトリ一覧中のすべてのサービスが
' インスタンス化されるときに読み込まれるメインスレッド
Dim ServicesToRun() As _
System.ServiceProcess.ServiceBase

' サービスを実行するように設定する
ServicesToRun = New _
System.ServiceProcess.ServiceBase() _
{New AppMonitorService}
System.ServiceProcess.ServiceBase.Run( _
ServicesToRun)
End Sub

 ServicesToRunオブジェクトには、同じプロセス空間(つまりシステムリソースの消費を抑えられる)のもとで実行させたいサービスクラスの配列を入れておく。ただし同じプロセス空間で実行されても、管理についてはそれぞれ独立する。

 そしてこのサービスの配列をServiceBase.Runメソッドに引き渡す。ServiceBase.Runメソッドは、渡されたサービスを調べ、[スタートアップの種類]が[自動]に設定されているものすべてを開始する。

 最初に作成したサービスのクラスには、「Service1」という名前が自動的に付けられるという点に注意してほしい。もしサービスのクラス名を変更するならば、手作業でコードの行を次のように変更しなければならない(訳注:下記のコードは「Service1」というクラス名から「AppMonitorService」というクラス名に変更した場合)。

【自動生成されたコード】
ServicesToRun = New _
System.ServiceProcess.ServiceBase() _
{New Service1}
System.ServiceProcess.ServiceBase.Run( _
ServicesToRun)

【変更後のコード】
ServicesToRun = New _
System.ServiceProcess.ServiceBase() _
{New AppMonitorService}
System.ServiceProcess.ServiceBase.Run( _
ServicesToRun)

 Visual Studio .NET 2003では自動生成されないが、基底クラスにおけるいくつかのWindowsサービスのイベントをオーバーライドすることで、イベント処理をフックできる。AppMonitorサービスにおいて、サービスイベントをオーバーライドしたコードをリスト1に示す。プロシージャはオーバーライドとなるため、正しくコンパイルするためには、プロシージャ名や引数は厳密に合致させなければならない。

© Copyright 2001-2005 Fawcette Technical Publications

注目のテーマ