初めて作る.NET Windowsサービス:Visual Studio Magazine(5/7 ページ)
特にUIを持たずWindowsのバックグラウンドで動作する「Windowsサービス」。この特集では、実践的な開発手法レクチャーとして、.NETアプリケーションにモニタリング機能を提供するWindowsサービス作成方法を解説していく。
サービスのラッパークラスを作る
さてサービスを作成してインストールしたところで、デスクトップクライアントアプリケーションがAppMonitorサービスとやり取りできるようにする方法を考えていこう。
これを実現するもっとも簡単な方法は、サービスにOnCustomCommandイベントを実装しておき、それぞれのアプリケーションがモニタリングのコマンドをサービスに向けて送信できるようにする方法だ(これについてはすぐ後に述べる)。Windowsサービスは整数値だけを受け取ることができ、戻り値を返すことはできない。
ユーザーサービスコマンドの規約に関する不十分なドキュメントによれば、サービスのカスタムユーザーコマンドは、128〜255の範囲でなければならないことになっている。128より小さな値は、システムレベルのコマンドとしてWindowsによって予約されているためだ。もし、この範囲外のカスタムサービスコマンドを送ると、次のような分かりづらいWin32例外を受け取ることになってしまう。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
AppMonitorサービスとのインタフェースを実装するもっとも簡単な方法は、すべてのデスクトップアプリケーションから利用できるラッパークラスを作成することだ。
ラッパークラスの目的は、どこでどのようにモニタリングサービスが実装されているのかという詳細を隠すことだ。ラッパークラスを利用することで、クライアントアプリケーションにいっさい影響を与えることなく、モニタリングサービスを容易に設計変更できるようにもなる。
さまざまなモニタリングコマンドのコードをエミュレートするMonitorWrapperクラスを作ろう。このクラスには、外部アプリケーションがモニタリングコマンドを送信できるひとつのメソッド(MonitorThis)を実装しておく(リスト2)。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
Windowsサービスのクラス群を利用するには、ServiceProcess名前空間を参照する必要があるという点に注意しよう。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
そしてServiceProcess.dllコンポーネントを参照設定するため、ソリューションエクスプローラの[参照設定]フォルダの下で[参照の追加]を選ぶ(画面3)。
画面3■ServiceProcess.dllへの参照を追加する。System.ServiceProcess名前空間を利用するプロジェクトでは、Windowsサービスクラスのオブジェクトやプロパティとやりとりするために、ServiceProcess.dllコンポーネントを明示的に参照設定しなければならない
ServiceProcessコンポーネントを参照設定することで、Windowsサービスに関する中心的な機能を担うServiceControllerクラスを利用できるようになる。ServiceControllerオブジェクトを使うことで、サービスに問い合わせを出したり、サービスの制御、ほかサービスに関するほぼすべてのプロパティを設定することができる。
MonitorThisメソッドの実装から分かるように、最初にすべきことは、AppMonitorサービスに関連付けられたServiceContollerオブジェクトのインスタンスを得ることだ。インスタンスが存在したら、ExecuteCommandメソッドを使ってサービスにコマンドを送信する前に、サービスが開始されているかどうかを確認する。
さてMonitorWrapperクラスを書いたところで、ほかのデスクトップアプリケーションから使えるような配置を考えなければならない。一般にはクラスをGACに配置することになるが、本稿では話を簡単にするため、サンプルのデスクトップアプリケーション(SecurityController)において、MonitorWrapperクラスをプロジェクトの参照設定することにする。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
© Copyright 2001-2005 Fawcette Technical Publications