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

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

サービスをインストールする

 サービスを作成したら、該当サービスをインストールできるようにしなければならない。

 AppMonitorプロジェクトにインストーラを追加するには、デザインビューに切り替え、プロパティタブにある[Add Installer]というリンク(訳注:日本語版では[インストーラの追加])をクリックする(画面1参照)。

 このリンクをクリックすることで、プロジェクトにProjectInstaller.vbというモジュールが加わる。このモジュールをデザインビューで開くと、2つの新しいコンポーネント(ServiceProcessInstallerとServiceInstaller)が含まれていることを確認できる。ServiceProcessInstallerコンポーネントはWindowsサービスプロジェクトのためのものであり、サービスが実行される時のアカウント種別(LocalSystem、LocalUser、Userなど)と資格情報(クレデンシャル)を保持する。

 ServiceInstallerコンポーネントは、レジストリ(HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services)に書かれるサービスに関する情報を保持する。この情報には、「サービス名」「表示名」「依存するサービス群」「スタートアップの種類([自動]、[手動]、[無効]――標準設定では[手動])」が含まれる。

 プロジェクトに複数のサービスを含んでいるなら、それぞれのサービスに対するServiceInstallerコンポーネントを個別に用意すべきだ。なお、ServiceInstallerコンポーネントのInstallイベントやUninstallイベントを使うと、インストール時の追加処理を実装することもできる。

 いちどこれらのコンポーネントがプロジェクトに追加され、コンパイルされると、RunInstaller属性がTrueに設定される。インストーラが実行される時には、RunInstaller属性がTrueであるクラスだけがインストールされる(自動生成されたコードとProjectInstaller.vbモジュールにおいてフック可能なイベントについてはリストAを参照)。

リストA■ProjdctInstaller.vbモジュールにおけるイベントのフック(VB.NET)。Visual Studio .NETは、ProjectInstallerというクラスモジュールを生成する。このクラスには、Windowsサービスに関するレジストリに値を書き込むときに使うプロパティが含まれている。AfterInstallイベントをフックすれば、インストール時にさらにカスタム化した処理を実行することもできる
<RunInstaller(True)> Public Class ProjectInstaller
Inherits System.Configuration.Install.Installer

#Region "コンポーネント デザイナで生成されたコード"
Public Sub New()
MyBase.New()

' この呼び出しは、コンポーネント デザイナで必要です。
InitializeComponent()

' InitializeComponent() 呼び出しの後に初期化を追加します。

End Sub

' Installer は、コンポーネント一覧に後処理を実行するために
' dispose をオーバーライドします。
Protected Overloads Overrides Sub Dispose( _
ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

' コンポーネント デザイナで必要です。
Private components As _
System.ComponentModel.IContainer

' メモ : 以下のプロシージャはコンポーネント デザイナで必要です。
' コンポーネント デザイナを使って変更してください。
' コード エディタを使って変更しないでください。
Friend WithEvents _
AppMonitorServiceProcessInstaller As _
System.ServiceProcess.ServiceProcessInstaller
Friend WithEvents AppMonitorServiceInstaller As _
System.ServiceProcess.ServiceInstaller
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Me.AppMonitorServiceProcessInstaller = New _
System.ServiceProcess.ServiceProcessInstaller
Me.AppMonitorServiceInstaller = New _
System.ServiceProcess.ServiceInstaller
'
'AppMonitorServiceProcessInstaller
'
Me.AppMonitorServiceProcessInstaller.Account = _
System.ServiceProcess.ServiceAccount.LocalSystem
Me.AppMonitorServiceProcessInstaller.Password _
= Nothing
Me.AppMonitorServiceProcessInstaller.Username _
= Nothing
'
'AppMonitorServiceInstaller
'
Me.AppMonitorServiceInstaller.DisplayName = _
"AppMonitor Service"
Me.AppMonitorServiceInstaller.ServiceName = _
"AppMonitor"
'
'ProjectInstaller
'
Me.Installers.AddRange(New _
System.Configuration.Install.Installer() _
{Me.AppMonitorServiceProcessInstaller, _
Me.AppMonitorServiceInstaller})

End Sub

#End Region

Private Sub _
AppMonitorServiceProcessInstaller_AfterInstall _
(ByVal sender As System.Object, ByVal e As _
System.Configuration.Install.InstallEventArgs) _
Handles AppMonitorServiceProcessInstaller.AfterInstall

End Sub

Private Sub AppMonitorServiceInstaller_AfterInstall _
(ByVal sender As System.Object, ByVal e As _
System.Configuration.Install.InstallEventArgs) _
zHandles AppMonitorServiceInstaller.AfterInstall

End Sub

End Class

 AppMonitorプロジェクトのディレクトリ直下にあるbinディレクトリに移動して、InstallUtilプログラムを実行すれば、サービスをインストールできる。

 InstallUtilは.NET Frameworkのユーティリティで、インストールの対象となる実行環境上の.NETインストーラを実行するものだ(.NET Frameworkをインストールしたあとに、.NET Frameworkのディレクトリにパスが通してあるものと想定する)。また、AppMonitorサービスをインストールするには、次のコマンドを利用する。

InstallUtil AppMonitor.exe

 同様にInstallUtilを使って次のように指定すれば、サービスをアンインストールできる。ただしサービスが停止している場合に限る。

InstallUtil AppMonitor.exe /u

 .NET Frameworkの複数バージョンを使っている場合には、コンパイルした.NET Frameworkと同じバージョンのInstallUtilを使わなければならない。InstallUtil.exeは、.NET Frameworkのディレクトリにある(訳注:x.y.zzzzはバージョン番号)。

%WINDIR%\Microsoft.NET\Framework\vx.y.zzzz

 AppMonitorプロジェクトでInstallUtilを実行したら、そのコマンドウィンドウの結果を確認しよう。InstallUtilは、結果を「サービス名.InstallLog」というファイルにも記録する。

 Windowsサービスをコンパイルおよびインストールする時の最後の注意点は、プロジェクトの\binディレクトリからサービスをインストールした場合、サービスが実行されている間は該当サービスのプロジェクトを再コンパイルできなくなるという点だ。これは、Windowsがサービスの実行ファイルをロックするためである。

© Copyright 2001-2005 Fawcette Technical Publications

注目のテーマ