チュートリアル: コンポーネント デザイナーによる Windows サービス アプリケーションの作成
注意
Windows サービスのテンプレートおよび関連する機能は、Visual Studio の Standard Edition では使用できません。
このトピックでは、イベント ログにメッセージを書き込む単純な Windows サービス アプリケーションを作成する手順を示します。 サービスを作成して使用するための基本的な手順は次のとおりです。
Windows サービス アプリケーション テンプレートを使用してプロジェクトを作成します。 このテンプレートは、ServiceBase を継承するクラスを作成し、基本的なサービス コードの多く (サービスを開始するコードなど) を記述します。
OnStart プロシージャおよび OnStop プロシージャのコードを記述し、再定義が必要な他のすべてのメソッドをオーバーライドします。
サービス アプリケーションの必要なインストーラーを追加します。 既定では、[インストーラーの追加] リンクをクリックしたときに、複数のインストーラーを含むクラスが、プロセスのインストール用に 1 つ、プロジェクトに含まれる関連サービスごとに 1 つずつ、アプリケーションに追加されます。
プロジェクトをビルドします。
サービスをインストールするセットアップ プロジェクトを作成し、サービスをインストールします。
Windows 2000 サービス コントロール マネージャーにアクセスし、サービスを開始します。
最初に、プロジェクトを作成し、サービスが正しく機能するために必要な値を設定します。
注意
お使いのマシンで、Visual Studio ユーザー インターフェイスの一部の要素の名前や場所が、次の手順とは異なる場合があります。 これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。 詳細については、「Visual Studio の設定」を参照してください。
サービスの作成
サービスを作成して設定するには
[ファイル] メニューの [新しいプロジェクト] をクリックします。
[新しいプロジェクト] ダイアログ ボックスが表示されます。
Visual Basic または Visual C# のプロジェクト テンプレートの一覧で、Windows サービスを選択し、プロジェクトに「MyNewService」という名前を付けます。 [OK] をクリックします。
注意
プロジェクト テンプレートは、System.ServiceProcess.ServiceBase を継承する Service1 という名前のコンポーネント クラスを自動的に追加します。
デザイナーをクリックして Service1 を選択します。 その後、プロパティ ウィンドウで Service1 の ServiceName プロパティと (Name) プロパティを MyNewService に設定します。
サービスへの機能追加
次のセクションでは、Windows サービスにカスタム イベント ログを追加します。 イベント ログは、Windows サービスとまったく関連付けられていません。 ここでは、Windows サービスに追加できるコンポーネントの種類の例として、EventLog コンポーネントを使用しています。
サービスにカスタム イベント ログ機能を追加するには
ソリューション エクスプローラーで Service1.vb または Service1.cs を右クリックし、[デザイナーの表示] をクリックします。
ツールボックスの [コンポーネント] タブから、EventLog コンポーネントをデザイナーにドラッグします。
ソリューション エクスプローラーで Service1.vb または Service1.cs を右クリックし、[コードの表示] をクリックします。
コンストラクターを追加または編集して、カスタム イベント ログを定義します。
' 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"; }
サービスの開始時の処理を定義するには
コード エディターで、プロジェクトを作成したときに自動的にオーバーライドされた 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"); }
注意
サービス アプリケーションは、長時間実行されるようにデザインされています。 そのため、通常は、システム内の何かをポーリングまたは監視します。 この監視は、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."); }
また、OnPause、OnContinue、および OnShutdown の各メソッドをオーバーライドして、コンポーネントの処理をさらに定義することもできます。
サービスに対して他の処理を定義するには
処理するメソッドに対して、適切なメソッドをオーバーライドし、実行する処理を定義します。
OnContinue メソッドをオーバーライドしたときのコードの例を次に示します。
Protected Overrides Sub OnContinue() EventLog1.WriteEntry("In OnContinue.") End Sub
protected override void OnContinue() { eventLog1.WriteEntry("In OnContinue."); }
Windows サービスをインストールするときに、いくつかのカスタム動作を実行する必要があります。これらの処理は、Installer クラスによって実行できます。 Visual Studio は、これらのインストーラーを Windows サービス専用に作成し、プロジェクトに追加できます。
サービスのインストーラーを作成するには
ソリューション エクスプローラーで Service1.vb または Service1.cs を右クリックし、[デザイナーの表示] をクリックします。
デザイナーの背景をクリックして、サービスの内容ではなくサービス自体を選択します。
デザイナーにフォーカスを置いた状態で右クリックし、[インストーラーの追加] をクリックします。
既定では、2 つのインストーラーを含むコンポーネント クラスがプロジェクトに追加されます。 このコンポーネントは ProjectInstaller という名前で、サービス用のインストーラーと、サービスの関連プロセス用のインストーラーを含んでいます。
ProjectInstaller のデザイン ビューで、[ServiceInstaller1] または [serviceInstaller1] をクリックします。
[プロパティ] ウィンドウで、ServiceName プロパティが MyNewService に設定されていることを確認します。
デザイナーで、[ServiceProcessInstaller1] (Visual Basic プロジェクトの場合) または [serviceProcessInstaller1] (Visual C# プロジェクトの場合) をクリックします。 Account プロパティを LocalSystem に設定します。 これにより、サービスがインストールされ、ローカル サービス アカウントで実行されます。
セキュリティに関するメモ
LocalSystem アカウントには、イベント ログへの書き込みを含む、幅広いアクセス許可が設定されています。 このアカウントは悪意のあるソフトウェアから攻撃されるリスクが高いため、使用する場合は注意が必要です。 その他のタスクについては、ローカル コンピューターで非特権ユーザーとして機能し、リモート サーバーには匿名の資格情報を渡す LocalService アカウントの使用を検討してください。
サービス プロジェクトをビルドするには
ソリューション エクスプローラーで、プロジェクトを右クリックし、[プロパティ] をクリックします。 プロジェクトのプロパティ デザイナーが表示されます。
[アプリケーション] ページで、[スタートアップ オブジェクト] ボックスの一覧の [MyNewService] をクリックします。
Ctrl キーと Shift キーを押しながら B キーを押して、プロジェクトをビルドします。
これでプロジェクトがビルドされ、配置できるようになりました。 セットアップ プロジェクトは、コンパイルされたプロジェクト ファイルをインストールし、Windows サービスの実行に必要なインストーラーを実行します。 完全なセットアップ プロジェクトを作成するには、プロジェクトの出力である MyNewService.exe をセットアップ プロジェクトに追加し、MyNewService.exe をインストールするカスタム動作を追加する必要があります。 セットアップ プロジェクトの詳細については、「セットアップ/配置プロジェクト」を参照してください。 カスタム動作の詳細については、「チュートリアル : カスタム動作の作成」を参照してください。
サービスのセットアップ プロジェクトを作成するには
ソリューション エクスプローラーで、対象のソリューションを右クリックし、[追加] をポイントして、[新しいプロジェクト] をクリックします。
[インストールされたテンプレート] で、[その他のプロジェクトの種類] を展開し、[セットアップと配置] を展開します。
[Visual Studio インストーラー] を選択します。
[テンプレート] ペインの [セットアップ プロジェクト] をクリックします。 プロジェクトに「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 7、Windows Vista、および Windows Server でサービス コントロール マネージャーを開くには、[スタート] メニューで [コンピューター] を右クリックし、[管理] をクリックします。 [コンピューターの管理] コンソールで、左ペインにある [サービスとアプリケーション] ノードを展開します。 [サービス] をクリックします。
ウィンドウの [サービス] セクションの一覧に MyNewService が表示されます。
一覧で目的のサービスを右クリックし、[開始] をクリックします。
サービスを右クリックし、[中止] をクリックします。
サービスのイベント ログ出力を検査するには
サーバー エクスプローラーを表示し、[イベント ログ] ノードにアクセスします。
注意
Windows サービスのテンプレートおよび関連する機能は、Visual Studio の Standard Edition では使用できません。
MyNewLog のリスティングを展開します。 サービスが実行した処理に対するエントリが表示されます。
サービスをアンインストールするには
- [スタート] メニューの [コントロール パネル] をクリックし、[プログラムの追加と削除] をクリックします。アンインストールするサービスを選択し、[アンインストール] をクリックします。
次の手順
インストールしたサービスにコマンドを送信するための ServiceController コンポーネントの使用法を調べることもできます。
インストーラーを使用すると、アプリケーションの実行時にイベント ログを作成する代わりに、アプリケーションのインストール時にイベント ログを作成できます。 さらに、イベント ログは、アプリケーションがアンインストールされたときにインストーラーによって削除されます。
参照
処理手順
方法 : サービス アプリケーションにインストーラーを追加する
方法 : Windows サービス アプリケーションをデバッグする
参照
方法 : サーバー エクスプローラー/データベース エクスプローラーにアクセスして初期化する