misc.log

日常茶飯事とお仕事と

VB.NETでWindowsサービスを作る

Windowsサービスを作る必要が出てきた。ただ、最終目標は、「独自フレームワークでのやりかたを保ちながら、Windowsサービスを作成する」ということ。とりあえず、普通にサービスを作ることからやってみようか。言語はVB.NET 2003。

  1. まず、Visual Studioを起動し、新しいプロジェクトの立ち上げ用ダイアログから、[Visual Basic]⇒[Windowsサービス]を選択する。
  2. フォルダやソリューション名は適当に命名。
  3. ひな形が出来るので、「Protected Overrides Sub OnStart(ByVal args() As String)」に処理を記述する。
  4. 終わり。

え〜!?終わり?

でも、これでは動かない。サービスを動かすには、サービスをシステムにインストールする必要がある。残念ながら、この状態から「実行」とかやっても、サービスのデバッグは出来ないらしい。デバッグには、何らかの方法でサービスを登録し、動かした状態で、開発環境(デバッガ)を動いているサービスにアタッチしないといけないそうだ。

開発用の登録ユーティリティ(InstallUtil.exe)もあるようだが、実際につくってリリースする場合にはインストーラを作る必要があるそうなので、それをやってみよう。

  1. ソリューションエクスプローラから、先ほどコードを書いたクラスをダブルクリックし、デザイン画面(といっても白紙だが)を開く。
  2. デザイン画面の適当なところを右クリックし、表示されるメニューから「インストーラを追加」を選ぶ。
  3. 新しいデザイン画面(というか新しいクラス)が追加され、ServiceProcessInstallerと、ServiceInstallerが貼り付けられる。
  4. ServiceInstallerオブジェクトのプロパティを適当に設定する。サービス名や、自動起動/手動起動などの設定はこのプロパティで定義されるようだ。
  5. 終わり。

えぇ?これだけですか?

で、これだけではダメらしい。ここで追加したのは、サービスとしてのインストールにまつわる処理をやってくれるモノのようで。実際のインストーラは、ソリューションにセットアップ用プロジェクト(拡張子.msiのファイルを作成するプロジェクト)を追加する必要があるようだ。

...でやってみた。ダメじゃん。インストールしても、その後に再起動しても、サービスの一覧に作ったサービスが登場しない。なんで??

理由は...
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1150742&SiteID=7
によると、セットアッププロジェクトの追加と作成は、前述のInstallUtil.exeに「代わるものではなくて」、単に、リリース先で「InstallUtil.exeを自動実行させるための枠組み」でしかないようだ。てっきり、セットアッププロジェクトで出来るインストーラが、InstallUtil.exeの動作を代行してくれるのかとおもっていたが、そうではないらしい。


...んー、もちょっと調べたいけど時間切れ。続きはまた明後日。

続きは、id:frontline:20070322:p2にて。