チュートリアル : コンポーネント デザイナによる Windows サービス アプリケーションの作成
更新 : 2007 年 11 月
メモ : |
---|
Windows サービスのテンプレートおよび関連する機能は、Visual Studio の Standard Edition では使用できません。 |
このトピックでは、イベント ログにメッセージを書き込む単純な Windows サービス アプリケーションを作成する手順を示します。サービスを作成して使用するための基本的な手順は次のとおりです。
Windows サービス アプリケーション テンプレートを使用してプロジェクトを作成します。このテンプレートは、ServiceBase を継承するクラスを作成し、基本的なサービス コードの多く (サービスを開始するコードなど) を記述します。
OnStart プロシージャおよび OnStop プロシージャのコードを記述し、再定義が必要な他のすべてのメソッドをオーバーライドします。
サービス アプリケーションの必要なインストーラを追加します。既定では、[インストーラの追加] リンクをクリックしたときに、複数のインストーラを含むクラスが、プロセスのインストール用に 1 つ、プロジェクトに含まれる関連サービスごとに 1 つずつ、アプリケーションに追加されます。
プロジェクトをビルドします。
サービスをインストールするセットアップ プロジェクトを作成し、サービスをインストールします。
Windows 2000 サービス コントロール マネージャにアクセスし、サービスを開始します。
最初に、プロジェクトを作成し、サービスが正しく機能するために必要な値を設定します。
メモ : |
---|
お使いのマシンで、Visual Studio ユーザー インターフェイスの一部の要素の名前や場所が、次の手順とは異なる場合があります。これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。詳細については、「Visual Studio の設定」を参照してください。 |
サービスの作成
サービスを作成して設定するには
[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
[新しいプロジェクト] ダイアログ ボックスが表示されます。
Visual Basic、Visual C#、Visual C++、または Visual J# のプロジェクト テンプレートの一覧で、Windows サービス プロジェクトを選択し、「MyNewService」という名前を付けます。[OK] をクリックします。
メモ : プロジェクト テンプレートは、System.ServiceProcess.ServiceBase を継承する Service1 という名前のコンポーネント クラスを自動的に追加します。
デザイナをクリックして Service1 を選択します。その後、[プロパティ] ウィンドウで Service1 の [ServiceName] プロパティと [(Name)] プロパティを MyNewService に設定します。
[AutoLog] プロパティを true に設定します。
[表示] メニューの [コード] をクリックしてコード エディタを開きます。Main メソッドを編集して、MyNewService のインスタンスを作成するようにします。手順 3 でサービスの名前を変更したときに、Main メソッド内のクラス名は変更されません。Visual C# アプリケーションおよび Visual J# アプリケーションの Main メソッドは、それぞれ Program.cs ファイルと Program.js ファイルに存在します。
' To access the Main method in Visual Basic, select Main from the ' method name drop-down list. This expands the Component Designer ' generated code region. Shared Sub Main() Dim ServicesToRun() As System.ServiceProcess.ServiceBase ' Change the following line to match. ServicesToRun = New System.ServiceProcess.ServiceBase() _ {New MyNewService()} System.ServiceProcess.ServiceBase.Run(ServicesToRun) End Sub
static void Main() { System.ServiceProcess.ServiceBase[] ServicesToRun; // Change the following line to match. ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyNewService() }; System.ServiceProcess.ServiceBase.Run(ServicesToRun); }
public static void main(String[] args) { System.ServiceProcess.ServiceBase[] ServicesToRun; ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyNewService() }; System.ServiceProcess.ServiceBase.Run(ServicesToRun); }
サービスへの機能追加
次のセクションでは、Windows サービスにカスタム イベント ログを追加します。イベント ログは、Windows サービスとまったく関連付けられていません。ここでは、Windows サービスに追加できるコンポーネントの種類の例として、EventLog コンポーネントを使用しています。カスタム イベント ログの詳細については、「方法 : カスタム イベント ログを作成または削除する」を参照してください。
サービスにカスタム イベント ログ機能を追加するには
ソリューション エクスプローラで Service1.vb、Service1.cs、または Service1.jsl を右クリックし、[デザイナの表示] をクリックします。
ツールボックスの [コンポーネント] タブから、EventLog コンポーネントをデザイナにドラッグします。
ソリューション エクスプローラで Service1.vb、Service1.cs、または Service1.jsl を右クリックし、[コードの表示] をクリックします。
コンストラクタを編集して、カスタム イベント ログを定義します。
' To access the constructor in Visual Basic, select New from the ' method name drop-down list. Public Sub New() MyBase.New() InitializeComponent() If Not System.Diagnostics.EventLog.SourceExists("MySource") Then System.Diagnostics.EventLog.CreateEventSource("MySource", _ "MyNewLog") End If EventLog1.Source = "MySource" EventLog1.Log = "MyNewLog" End Sub
public MyNewService() { InitializeComponent(); if (!System.Diagnostics.EventLog.SourceExists("MySource")) { System.Diagnostics.EventLog.CreateEventSource( "MySource","MyNewLog"); } eventLog1.Source = "MySource"; eventLog1.Log = "MyNewLog"; }
public MyNewService() { InitializeComponent(); if (!System.Diagnostics.EventLog.SourceExists("MySource")) { System.Diagnostics.EventLog.CreateEventSource( "MySource", "MyNewLog"); } eventLog1.set_Source("MySource"); eventLog1.set_Log("MyNewLog"); }
サービスの開始時の処理を定義するには
コード エディタで、プロジェクトを作成したときに自動的にオーバーライドされた OnStart メソッドを探し、サービスが実行を開始したときに行う処理を決定するコードを記述します。
' To access the OnStart in Visual Basic, select OnStart from the ' method name drop-down list. Protected Overrides Sub OnStart(ByVal args() As String) EventLog1.WriteEntry("In OnStart") End Sub
protected override void OnStart(string[] args) { eventLog1.WriteEntry("In OnStart"); }
protected void OnStart(String[] args) { eventLog1.WriteEntry("In OnStart"); }
メモ : サービス アプリケーションは、長時間実行されるようにデザインされています。そのため、通常は、システム内の何かをポーリングまたは監視します。この監視は、OnStart メソッドで設定します。ただし、OnStart は実際には監視を行いません。OnStart メソッドは、サービスの操作が開始された後にオペレーティング システムに戻る必要があります。永久的に続くループやブロックは実行できません。単純なポーリング機構を作成するには、System.Timers.Timer コンポーネントを使用できます。OnStart メソッドで、コンポーネントにパラメータを設定し、Enabled プロパティを true に設定します。このタイマによって、コード内で定期的にイベントが発生します。サービスは、イベントが発生するごとに監視を実行できます。
サービスの停止時の処理を定義するには
コード エディタの [メソッド名] ボックスの一覧で、プロジェクトを作成したときに自動的にオーバーライドされた OnStop プロシージャを選択します。サービスが停止したときに行う処理を決定するコードを記述します。
Protected Overrides Sub OnStop() EventLog1.WriteEntry("In OnStop.") End Sub
protected override void OnStop() { eventLog1.WriteEntry("In onStop."); }
protected void OnStop() { eventLog1.WriteEntry("In onStop."); }
また、OnPause、OnContinue、および OnShutdown の各メソッドをオーバーライドして、コンポーネントの処理をさらに定義することもできます。
サービスに対して他の処理を定義するには
処理するメソッドに対して、適切なメソッドをオーバーライドし、実行する処理を定義します。
OnContinue メソッドをオーバーライドしたときのコードの例を次に示します。
Protected Overrides Sub OnContinue() EventLog1.WriteEntry("In OnContinue.") End Sub
protected override void OnContinue() { eventLog1.WriteEntry("In OnContinue."); }
protected void OnContinue() { eventLog1.WriteEntry("In OnContinue."); }
Windows サービスをインストールするときに、いくつかのカスタム動作を実行する必要があります。これらの処理は、Installer クラスによって実行できます。Visual Studio は、これらのインストーラを Windows サービス専用に作成し、プロジェクトに追加できます。
サービスのインストーラを作成するには
ソリューション エクスプローラで Service1.vb、Service1.cs、または Service1.jsl を右クリックし、[デザイナの表示] をクリックします。
デザイナの背景をクリックして、サービスの内容ではなくサービス自体を選択します。
デザイナにフォーカスを置いた状態で右クリックし、[インストーラの追加] をクリックします。
既定では、2 つのインストーラを含むコンポーネント クラスがプロジェクトに追加されます。このコンポーネントは ProjectInstaller という名前で、サービス用のインストーラと、サービスの関連プロセス用のインストーラを含んでいます。
ProjectInstaller のデザイン ビューで、[ServiceInstaller1] または [serviceInstaller1] をクリックします。
[プロパティ] ウィンドウで、[ServiceName] プロパティを MyNewService に設定します。
デザイナで、[ServiceProcessInstaller1] (Visual Basic プロジェクトの場合) または [serviceProcessInstaller1] (Visual C# プロジェクトまたは Visual J# プロジェクトの場合) をクリックします。[Account] プロパティを LocalService に設定します。これにより、サービスがインストールされ、ローカル サービス アカウントで実行されます。
セキュリティに関するメモ : LocalService アカウントは、ローカル コンピュータで非特権ユーザーとして機能し、リモート サーバーには匿名の資格情報を渡します。その他のアカウントは高い特権で実行され、悪意あるコードから攻撃されるリスクが高くなるため、その使用には注意が必要です。
サービス プロジェクトをビルドするには
ソリューション エクスプローラで、プロジェクトを右クリックし、[プロパティ] をクリックします。プロジェクトのプロパティ デザイナが表示されます。
[アプリケーション] ページで、[スタートアップ オブジェクト] ボックスの一覧の [MyNewService] をクリックします。
Ctrl キーと Shift キーを押しながら B キーを押して、プロジェクトをビルドします。
これでプロジェクトがビルドされ、配置できるようになりました。セットアップ プロジェクトは、コンパイルされたプロジェクト ファイルをインストールし、Windows サービスの実行に必要なインストーラを実行します。完全なセットアップ プロジェクトを作成するには、プロジェクトの出力である MyNewService.exe をセットアップ プロジェクトに追加し、MyNewService.exe をインストールするカスタム動作を追加する必要があります。セットアップ プロジェクトの詳細については、「セットアップ プロジェクト」を参照してください。カスタム動作の詳細については、「チュートリアル : カスタム動作の作成」を参照してください。
サービスのセットアップ プロジェクトを作成するには
ソリューション エクスプローラでソリューションを右クリックして選択し、[追加] をポイントして [新しいプロジェクト] をクリックします。
[プロジェクトの種類] ペインの [セットアップ/配置プロジェクト] フォルダをクリックします。
[テンプレート] ペインの [セットアップ プロジェクト] をクリックします。プロジェクトに「MyServiceSetup」という名前を付けます。[OK] をクリックします。
セットアップ プロジェクトがソリューションに追加されます。
次に、Windows サービス プロジェクトからの出力である MyNewService.exe をセットアップに追加します。
セットアップ プロジェクトに MyNewService.exe を追加するには
ソリューション エクスプローラで、[MyServiceSetup] を右クリックし、[追加] をポイントします。次に、[プロジェクト出力] をクリックします。
[プロジェクト出力グループの追加] ダイアログ ボックスが表示されます。
[プロジェクト] ボックスでは、[MyNewService] が選択されています。
一覧の [プライマリ出力] をクリックし、[OK] をクリックします。
MyNewService のプライマリ出力のプロジェクト項目がセットアップ プロジェクトに追加されます。
次に、MyNewService.exe ファイルをインストールするカスタム動作を追加します。
セットアップ プロジェクトにカスタム処理を追加するには
ソリューション エクスプローラで、セットアップ プロジェクトを右クリックし、[表示] をポイントします。次に、[カスタム動作] をクリックします。
カスタム動作エディタが表示されます。
カスタム動作エディタで、[カスタム動作] ノードを右クリックし、[カスタム動作の追加] をクリックします。
[プロジェクトから項目を選択] ダイアログ ボックスが表示されます。
一覧の [アプリケーション フォルダ] をダブルクリックして開き、[MyNewService (アクティブ) のプライマリ出力] をクリックし、[OK] をクリックします。
カスタム動作の 4 つのノードすべて (Install、Commit、Rollback、Uninstall) にプライマリ出力が追加されます。
ソリューション エクスプローラで、MyServiceSetup プロジェクトを右クリックし、[ビルド] をクリックします。
Windows サービスをインストールするには
MyNewService.exe をインストールするには、ソリューション エクスプローラでセットアップ プロジェクトを右クリックし、[インストール] をクリックします。
セットアップ ウィザードの手順に従って操作します。ソリューションをビルドし、保存します。
サービスを開始および停止するには
サービス コントロール マネージャを次のいずれかの方法で開きます。
Windows XP および Windows 2000 Professional のデスクトップで、[マイ コンピュータ] を右クリックし、[管理] をクリックします。[コンピュータの管理] コンソールで、[サービスとアプリケーション] ノードを展開します。
または
Windows Server 2003 および Windows 2000 Server では、[スタート] メニューの [プログラム] をポイントし、[管理ツール] をポイントして、[サービス] をクリックします。
メモ : Windows NT Version 4.0 では、コントロール パネルからこのダイアログ ボックスを開くことができます。
ウィンドウの [サービス] セクションの一覧に MyNewService が表示されます。
一覧で目的のサービスを右クリックし、[開始] をクリックします。
サービスを右クリックし、[中止] をクリックします。
サービスのイベント ログ出力を検査するには
サーバー エクスプローラを表示し、[イベント ログ] ノードにアクセスします。詳細については、「方法 : サーバー エクスプローラでイベント ログを使用する」を参照してください。
メモ : Windows サービスのテンプレートおよび関連する機能は、Visual Studio の Standard Edition では使用できません。
MyNewLog のリスティングを展開します。サービスが実行した処理に対するエントリが表示されます。
サービスをアンインストールするには
[スタート] メニューの [コントロール パネル] をクリックし、[プログラムの追加と削除] をクリックします。アンインストールするサービスを選択し、[アンインストール] をクリックします。
.msi ファイルのプログラム アイコンを右クリックして [アンインストール] をクリックしても、プログラムをアンインストールできます。
メモ : Windows 2000 にサービスをインストールした場合は、サービスを再インストールする前にシステムを再起動する必要があります。Windows 2000 では、システムを再起動するまでサービスは完全に削除されません。
次の手順
インストールしたサービスにコマンドを送信するための ServiceController コンポーネントの使用法を調べることもできます。ServiceController コンポーネントの使用法の詳細については、「Windows サービスの監視」を参照してください。
インストーラを使用すると、アプリケーションの実行時にイベント ログを作成する代わりに、アプリケーションのインストール時にイベント ログを作成できます。さらに、イベント ログは、アプリケーションがアンインストールされたときにインストーラによって削除されます。詳細については、「チュートリアル : イベント ログ コンポーネントのインストール」を参照してください。
参照
処理手順
方法 : サービス アプリケーションにインストーラを追加する
方法 : Windows サービス アプリケーションをデバッグする
方法 : サーバー エクスプローラからイベント ビューアを起動する
概念
参照
方法 : サーバー エクスプローラ/データベース エクスプローラにアクセスして初期化する