チュートリアル: Windows サービス アプリを作成するTutorial: Create a Windows service app

この記事では、イベント ログにメッセージを書き込む Windows サービス アプリを Visual Studio で作成する方法を示します。This article demonstrates how to create a Windows service app in Visual Studio that writes messages to an event log.

サービスを作成するCreate a service

最初に、プロジェクトを作成し、サービスが正しく機能するために必要な値を設定します。To begin, create the project and set the values that are required for the service to function correctly.

  1. Visual Studio の [ファイル] メニューで [新規] > [プロジェクト] を選択して (または Ctrl+Shift+N キーを押して)、 [新しいプロジェクト] ウィンドウを開きます。From the Visual Studio File menu, select New > Project (or press Ctrl+Shift+N) to open the New Project window.

  2. [Windows サービス (.NET Framework)] プロジェクト テンプレートに移動して選択します。Navigate to and select the Windows Service (.NET Framework) project template. これを見つけるには、 [インストール済み][Visual C#] または [Visual Basic] を展開し、 [Windows デスクトップ] を選択します。To find it, expand Installed and Visual C# or Visual Basic, then select Windows Desktop. または、右上の検索ボックスに「Windows サービス」と入力して Enter キーを押します。Or, enter Windows Service in the search box on the upper right and press Enter.

    Visual Studio の [新しいプロジェクト] ダイアログの Windows サービス アプリ テンプレート

    注意

    [Windows サービス] テンプレートが表示されない場合は、 .NET デスクトップ開発ワークロードのインストールが必要である可能性があります。If you don't see the Windows Service template, you may need to install the .NET desktop development workload:

    [新しいプロジェクト] ダイアログの左側にある [Visual Studio インストーラーを開く] を選択します。In the New Project dialog, select Open Visual Studio Installer on the lower left. [.NET デスクトップ開発] ワークロードを選択し、 [変更] を選択します。Select the .NET desktop development workload, and then select Modify.

  3. [名前] に「MyNewService」と入力し、 [OK] を選択します。For Name, enter MyNewService, and then select OK.

    [デザイン] タブが表示されます ( [Service1.cs [デザイン]] または [Service1.vb [デザイン]] )。The Design tab appears (Service1.cs [Design] or Service1.vb [Design]).

    プロジェクト テンプレートには、System.ServiceProcess.ServiceBase から継承される Service1 という名前のコンポーネント クラスが含まれます。The project template includes a component class named Service1 that inherits from System.ServiceProcess.ServiceBase. それは、サービスを開始するコードなどの多数の基本的なサービス コードを含んでいます。It includes much of the basic service code, such as the code to start the service.

サービスの名前を変更するRename the service

サービスの名前を Service1 から MyNewService に変更します。Rename the service from Service1 to MyNewService.

  1. ソリューション エクスプローラーService1.cs または Service1.vb を選択し、ショートカット メニューから [名前の変更] を選択します。In Solution Explorer, select Service1.cs, or Service1.vb, and choose Rename from the shortcut menu. ファイルの名前を MyNewService.cs または MyNewService.vb に変更し、Enter キーを押しますRename the file to MyNewService.cs, or MyNewService.vb, and then press Enter

    コード要素 Service1 に対するすべての参照名を変更するかどうかを確認するポップアップ ウィンドウが表示されます。A pop-up window appears asking whether you would like to rename all references to the code element Service1.

  2. ポップアップ ウィンドウで [はい] を選択します。In the pop-up window, select Yes.

    名前の変更のプロンプトRename prompt

  3. [デザイン] タブで、ショートカット メニューから [プロパティ] を選択します。In the Design tab, select Properties from the shortcut menu. [プロパティ] ウィンドウで ServiceName の値を MyNewService に変更します。From the Properties window, change the ServiceName value to MyNewService.

    サービスのプロパティService properties

  4. [ファイル] メニューから [すべて保存] を選択します。Select Save All from the File menu.

サービスに機能を追加するAdd features to the service

このセクションでは、Windows サービスにカスタム イベント ログを追加します。In this section, you add a custom event log to the Windows service. Windows サービスに追加できるコンポーネントの種類の例として、EventLog コンポーネントを使用しています。The EventLog component is an example of the type of component you can add to a Windows service.

サービスにカスタム イベント ログ機能を追加するAdd custom event log functionality

  1. ソリューション エクスプローラーで、MyNewService.cs または MyNewService.vb のショートカット メニューから [デザイナーの表示] を選択します。In Solution Explorer, from the shortcut menu for MyNewService.cs, or MyNewService.vb, choose View Designer.

  2. [ツールボックス][コンポーネント] を展開し、EventLog コンポーネントを [Service1.cs [デザイン]] タブまたは [Service1.vb [デザイン]] タブにドラッグします。In Toolbox, expand Components, and then drag the EventLog component to the Service1.cs [Design], or Service1.vb [Design] tab.

  3. ソリューション エクスプローラーで、MyNewService.cs または MyNewService.vb のショートカット メニューから [コードの表示] を選択します。In Solution Explorer, from the shortcut menu for MyNewService.cs, or MyNewService.vb, choose View Code.

  4. カスタム イベント ログを定義します。Define a custom event log. C# の場合は、既存の MyNewService() コンストラクターを編集します。Visual Basic の場合は、New() コンストラクターを追加します。For C#, edit the existing MyNewService() constructor; for Visual Basic, add the New() constructor:

    public MyNewService()
    {
        InitializeComponent();
        eventLog1 = new System.Diagnostics.EventLog();
        if (!System.Diagnostics.EventLog.SourceExists("MySource")) 
        {         
            System.Diagnostics.EventLog.CreateEventSource(
                "MySource","MyNewLog");
        }
        eventLog1.Source = "MySource";
        eventLog1.Log = "MyNewLog";
    }
    
    ' To access the constructor in Visual Basic, select New from the
    ' method name drop-down list. 
    Public Sub New()
        MyBase.New()
        InitializeComponent()
        Me.EventLog1 = New System.Diagnostics.EventLog
        If Not System.Diagnostics.EventLog.SourceExists("MySource") Then
            System.Diagnostics.EventLog.CreateEventSource("MySource",
            "MyNewLog")
        End If
        EventLog1.Source = "MySource"
        EventLog1.Log = "MyNewLog"
    End Sub
    
  5. System.Diagnostics 名前空間について、MyNewService.cs には using ステートメントを追加し (まだ存在しない場合)、MyNewService.vb には Imports ステートメントを追加します。Add a using statement to MyNewService.cs (if it doesn't already exist), or an Imports statement MyNewService.vb, for the System.Diagnostics namespace:

    using System.Diagnostics;
    
    Imports System.Diagnostics
    
  6. [ファイル] メニューから [すべて保存] を選択します。Select Save All from the File menu.

サービスの開始時の処理を定義するDefine what occurs when the service starts

MyNewService.cs または MyNewService.vb のコード エディターで、OnStart メソッドを見つけます (プロジェクトの作成時に、Visual Studio によって空のメソッド定義が自動的に作成されます)。In the code editor for MyNewService.cs or MyNewService.vb, locate the OnStart method; Visual Studio automatically created an empty method definition when you created the project. サービスの開始時にイベント ログに対するエントリを記述するコードを追加します。Add code that writes an entry to the event log when the service starts:

protected override void OnStart(string[] args)
{
    eventLog1.WriteEntry("In 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

ポーリングPolling

サービス アプリケーションは長期間実行するように設計されているため、通常は、(OnStart メソッドの設定に従って) システムをポーリングまたは監視しています。Because a service application is designed to be long-running, it usually polls or monitors the system, which you set up in the OnStart method. OnStart メソッドは、サービスの操作が開始された後にオペレーティング システムに戻る必要があります。そのため、システムはブロックされません。The OnStart method must return to the operating system after the service's operation has begun so that the system isn't blocked.

単純なポーリング メカニズムを設定するには、System.Timers.Timer コンポーネントを使用します。To set up a simple polling mechanism, use the System.Timers.Timer component. このタイマーによって、定期的な間隔で Elapsed イベントが発生します。サービスは、イベントが発生するごとに監視を実行できます。The timer raises an Elapsed event at regular intervals, at which time your service can do its monitoring. Timer コンポーネントは次のように使用します。You use the Timer component as follows:

  • MyNewService.OnStart メソッドで Timer コンポーネントのプロパティを設定します。Set the properties of the Timer component in the MyNewService.OnStart method.
  • Start メソッドを呼び出して、タイマーを開始します。Start the timer by calling the Start method.
ポーリング メカニズムを設定します。Set up the polling mechanism.
  1. MyNewService.OnStart イベントに次のコードを追加して、ポーリング メカニズムを設定します。Add the following code in the MyNewService.OnStart event to set up the polling mechanism:

    // Set up a timer that triggers every minute.
    Timer timer = new Timer();
    timer.Interval = 60000; // 60 seconds
    timer.Elapsed += new ElapsedEventHandler(this.OnTimer);
    timer.Start();
    
    ' Set up a timer that triggers every minute.
    Dim timer As Timer = New Timer()
    timer.Interval = 60000 ' 60 seconds
    AddHandler timer.Elapsed, AddressOf Me.OnTimer
    timer.Start()
    
  2. System.Timers 名前空間について、MyNewService.cs には using ステートメントを追加し、MyNewService.vb には Imports ステートメントを追加します。Add a using statement to MyNewService.cs, or an Imports statement to MyNewService.vb, for the System.Timers namespace:

    using System.Timers;
    
    Imports System.Timers
    
  3. MyNewService クラスに Timer.Elapsed イベントを処理する OnTimer メソッドを追加します。In the MyNewService class, add the OnTimer method to handle the Timer.Elapsed event:

    public void OnTimer(object sender, ElapsedEventArgs args)
    {
        // TODO: Insert monitoring activities here.
        eventLog1.WriteEntry("Monitoring the System", EventLogEntryType.Information, eventId++);
    }
    
    Private Sub OnTimer(sender As Object, e As Timers.ElapsedEventArgs)
       ' TODO: Insert monitoring activities here.
       eventLog1.WriteEntry("Monitoring the System", EventLogEntryType.Information, eventId)
       eventId = eventId + 1
    End Sub
    
  4. MyNewService クラスにメンバー変数を追加します。In the MyNewService class, add a member variable. それには、イベント ログに書き込まれる次のイベントの識別子が含まれます。It contains the identifier of the next event to write into the event log:

    private int eventId = 1;
    
    Private eventId As Integer = 1
    

すべての作業をメイン スレッド上で実行する代わりに、バックグラウンド ワーカー スレッドを使用してタスクを実行できます。Instead of running all your work on the main thread, you can run tasks by using background worker threads. 詳細については、System.ComponentModel.BackgroundWorker を参照してください。For more information, see System.ComponentModel.BackgroundWorker.

サービスの停止時の処理を定義するDefine what occurs when the service is stopped

サービスの停止時にイベント ログに対するエントリを追加するコード行を OnStop に挿入します。Insert a line of code in the OnStop method that adds an entry to the event log when the service is stopped:

protected override void OnStop()
{
    eventLog1.WriteEntry("In OnStop.");
}
Protected Overrides Sub OnStop()
    EventLog1.WriteEntry("In OnStop.")
End Sub

サービスに対して他の処理を定義するDefine other actions for the service

OnPauseOnContinue、および OnShutdown の各メソッドをオーバーライドして、コンポーネントの処理をさらに定義できます。You can override the OnPause, OnContinue, and OnShutdown methods to define additional processing for your component.

次のコードは、MyNewService クラスで OnContinue メソッドをオーバーライドする方法を示しています。The following code shows how you to override the OnContinue method in the MyNewService class:

protected override void OnContinue()
{
    eventLog1.WriteEntry("In OnContinue.");
}  
Protected Overrides Sub OnContinue()
    EventLog1.WriteEntry("In OnContinue.")
End Sub

サービスの状態を設定するSet service status

サービスは、その状態をサービス コントロール マネージャーに報告します。これによりユーザーは、サービスが正常に機能しているかどうかを確認することができます。Services report their status to the Service Control Manager so that a user can tell whether a service is functioning correctly. 既定では、ServiceBase から継承したサービスは、SERVICE_STOPPED、SERVICE_PAUSED、および SERVICE_RUNNING など、限られたセットの状態設定を報告します。By default, a service that inherits from ServiceBase reports a limited set of status settings, which include SERVICE_STOPPED, SERVICE_PAUSED, and SERVICE_RUNNING. サービスの開始に時間がかかる場合は、SERVICE_START_PENDING 状態を報告すると便利です。If a service takes a while to start up, it's useful to report a SERVICE_START_PENDING status.

Windows SetServiceStatus 関数を呼び出すコードを追加することで、SERVICE_START_PENDING および SERVICE_STOP_PENDING 状態設定を実装できます。You can implement the SERVICE_START_PENDING and SERVICE_STOP_PENDING status settings by adding code that calls the Windows SetServiceStatus function.

サービス保留の状態を実装するImplement service pending status

  1. System.Runtime.InteropServices 名前空間について、MyNewService.cs には using ステートメントを追加し、MyNewService.vb には Imports ステートメントを追加します。Add a using statement to MyNewService.cs, or an Imports statement to MyNewService.vb, for the System.Runtime.InteropServices namespace:

    using System.Runtime.InteropServices;
    
    Imports System.Runtime.InteropServices
    
  2. MyNewService.cs または MyNewService.vb に次のコードを追加して、ServiceState の値を宣言し、プラットフォーム呼び出しで使用する状態の構造を追加します。Add the following code to MyNewService.cs, or MyNewService.vb, to declare the ServiceState values and to add a structure for the status, which you'll use in a platform invoke call:

    public enum ServiceState
    {
        SERVICE_STOPPED = 0x00000001,
        SERVICE_START_PENDING = 0x00000002,
        SERVICE_STOP_PENDING = 0x00000003,
        SERVICE_RUNNING = 0x00000004,
        SERVICE_CONTINUE_PENDING = 0x00000005,
        SERVICE_PAUSE_PENDING = 0x00000006,
        SERVICE_PAUSED = 0x00000007,
    }
    
    [StructLayout(LayoutKind.Sequential)]
    public struct ServiceStatus
    {
        public int dwServiceType;
        public ServiceState dwCurrentState;
        public int dwControlsAccepted;
        public int dwWin32ExitCode;
        public int dwServiceSpecificExitCode;
        public int dwCheckPoint;
        public int dwWaitHint;
    };
    
    Public Enum ServiceState
        SERVICE_STOPPED = 1
        SERVICE_START_PENDING = 2
        SERVICE_STOP_PENDING = 3
        SERVICE_RUNNING = 4
        SERVICE_CONTINUE_PENDING = 5
        SERVICE_PAUSE_PENDING = 6
        SERVICE_PAUSED = 7
    End Enum
    
    <StructLayout(LayoutKind.Sequential)>
    Public Structure ServiceStatus
        Public dwServiceType As Long
        Public dwCurrentState As ServiceState
        Public dwControlsAccepted As Long
        Public dwWin32ExitCode As Long
        Public dwServiceSpecificExitCode As Long
        Public dwCheckPoint As Long
        Public dwWaitHint As Long
    End Structure
    

    注意

    サービス コントロール マネージャーは、SERVICE_STATUS 構造体dwWaitHint メンバーと dwCheckpoint メンバーを使って、Windows サービスの開始やシャットダウンまでの待機時間を判断します。The Service Control Manager uses the dwWaitHint and dwCheckpoint members of the SERVICE_STATUS structure to determine how much time to wait for a Windows service to start or shut down. OnStart メソッドと OnStop メソッドが長時間実行している場合、サービスは、インクリメントした dwCheckPoint 値で SetServiceStatus をもう一度呼び出すことによって、追加の時間を要求できます。If your OnStart and OnStop methods run long, your service can request more time by calling SetServiceStatus again with an incremented dwCheckPoint value.

  3. MyNewService クラスで、プラットフォーム呼び出しを使用して、SetServiceStatus 関数を宣言します。In the MyNewService class, declare the SetServiceStatus function by using platform invoke:

    [DllImport("advapi32.dll", SetLastError = true)]
    private static extern bool SetServiceStatus(System.IntPtr handle, ref ServiceStatus serviceStatus);
    
    Declare Auto Function SetServiceStatus Lib "advapi32.dll" (ByVal handle As IntPtr, ByRef serviceStatus As ServiceStatus) As Boolean
    
  4. SERVICE_START_PENDING 状態を実装するには、OnStart メソッドの先頭に次のコードを追加します。To implement the SERVICE_START_PENDING status, add the following code to the beginning of the OnStart method:

    // Update the service state to Start Pending.
    ServiceStatus serviceStatus = new ServiceStatus();
    serviceStatus.dwCurrentState = ServiceState.SERVICE_START_PENDING;
    serviceStatus.dwWaitHint = 100000;
    SetServiceStatus(this.ServiceHandle, ref serviceStatus);
    
    ' Update the service state to Start Pending.
    Dim serviceStatus As ServiceStatus = New ServiceStatus()
    serviceStatus.dwCurrentState = ServiceState.SERVICE_START_PENDING
    serviceStatus.dwWaitHint = 100000
    SetServiceStatus(Me.ServiceHandle, serviceStatus)
    
  5. OnStart メソッドの末尾に、状態を SERVICE_RUNNING に設定するコードを追加します。Add code to the end of the OnStart method to set the status to SERVICE_RUNNING:

    // Update the service state to Running.
    serviceStatus.dwCurrentState = ServiceState.SERVICE_RUNNING;
    SetServiceStatus(this.ServiceHandle, ref serviceStatus);
    
    ' Update the service state to Running.
    serviceStatus.dwCurrentState = ServiceState.SERVICE_RUNNING
    SetServiceStatus(Me.ServiceHandle, serviceStatus)
    
  6. (省略可能) OnStop が長時間実行されるメソッドの場合は、OnStop メソッドでこの手順を繰り返します。(Optional) If OnStop is a long-running method, repeat this procedure in the OnStop method. SERVICE_STOP_PENDING 状態を実装し、OnStop メソッドが終了する前に SERVICE_STOPPED 状態を返します。Implement the SERVICE_STOP_PENDING status and return the SERVICE_STOPPED status before the OnStop method exits.

    次に例を示します。For example:

    // Update the service state to Stop Pending.
    ServiceStatus serviceStatus = new ServiceStatus();
    serviceStatus.dwCurrentState = ServiceState.SERVICE_STOP_PENDING;
    serviceStatus.dwWaitHint = 100000;
    SetServiceStatus(this.ServiceHandle, ref serviceStatus);
    
    // Update the service state to Stopped.
    serviceStatus.dwCurrentState = ServiceState.SERVICE_STOPPED;
    SetServiceStatus(this.ServiceHandle, ref serviceStatus);
    
    ' Update the service state to Stop Pending.
    Dim serviceStatus As ServiceStatus = New ServiceStatus()
    serviceStatus.dwCurrentState = ServiceState.SERVICE_STOP_PENDING
    serviceStatus.dwWaitHint = 100000
    SetServiceStatus(Me.ServiceHandle, serviceStatus)
    
    ' Update the service state to Stopped.
    serviceStatus.dwCurrentState = ServiceState.SERVICE_STOPPED
    SetServiceStatus(Me.ServiceHandle, serviceStatus)
    

サービスにインストーラーを追加するAdd installers to the service

Windows サービスを実行するには、まず、サービスをインストールする必要があります。これにより、サービスがサービス コントロール マネージャーに登録されます。Before you run a Windows service, you need to install it, which registers it with the Service Control Manager. 登録の詳細を処理するインストーラーをプロジェクトに追加します。Add installers to your project to handle the registration details.

  1. ソリューション エクスプローラーで、MyNewService.cs または MyNewService.vb のショートカット メニューから [デザイナーの表示] を選択します。In Solution Explorer, from the shortcut menu for MyNewService.cs, or MyNewService.vb, choose View Designer.

  2. [デザイン] ビューでバックグラウンド領域を選択し、ショートカット メニューから [インストーラーの追加] を選択します。In the Design view, select the background area, then choose Add Installer from the shortcut menu.

    Visual Studio の既定では、2 つのインストーラーを含む ProjectInstaller というコンポーネント クラスがプロジェクトに追加されます。By default, Visual Studio adds a component class named ProjectInstaller, which contains two installers, to your project. これらのインストーラーはサービス用とサービスの関連プロセス用です。These installers are for your service and for the service's associated process.

  3. [ProjectInstaller][デザイン] ビューで、 [serviceInstaller1] (Visual C# プロジェクトの場合) または [ServiceInstaller1] (Visual Basic プロジェクトの場合) を選択してから、ショートカット メニューから [プロパティ] を選択します。In the Design view for ProjectInstaller, select serviceInstaller1 for a Visual C# project, or ServiceInstaller1 for a Visual Basic project, then choose Properties from the shortcut menu.

  4. [プロパティ] ウィンドウで、ServiceName プロパティが MyNewService に設定されていることを確認します。In the Properties window, verify the ServiceName property is set to MyNewService.

  5. サンプル サービスなどのテキストを Description プロパティに追加します。Add text to the Description property, such as A sample service.

    このテキストは [サービス] ウィンドウの [説明] 列に表示され、サービスに関する説明をユーザーに示します。This text appears in the Description column of the Services window and describes the service to the user.

    サービス ウィンドウのサービスの説明Service description in the Services window.

  6. DisplayName プロパティにテキストを追加します。Add text to the DisplayName property. たとえば、MyNewService Display Name です。For example, MyNewService Display Name.

    このテキストは、 [サービス] ウィンドウの [表示名] 列に表示されます。This text appears in the Display Name column of the Services window. この名前は、システムによって使用される (たとえば、ServiceName コマンドを使用してサービスを開始する場合) 名前である net start プロパティとは異なる名前にすることができます。This name can be different from the ServiceName property, which is the name the system uses (for example, the name you use for the net start command to start your service).

  7. ドロップダウン リストから StartType プロパティを Automatic に設定します。Set the StartType property to Automatic from the drop-down list.

  8. 完了すると、 [プロパティ] ウィンドウは次の図のようになります。When you're finished, the Properties windows should look like the following figure:

    Windows サービスのインストーラー プロパティInstaller Properties for a Windows service

  9. [ProjectInstaller][デザイン] ビューで、 [serviceProcessInstaller1] (Visual C# プロジェクトの場合) または [ServiceProcessInstaller1] (Visual Basic プロジェクトの場合) を選択してから、ショートカット メニューから [プロパティ] を選択します。In the Design view for ProjectInstaller, choose serviceProcessInstaller1 for a Visual C# project, or ServiceProcessInstaller1 for a Visual Basic project, then choose Properties from the shortcut menu. ドロップダウン リストから Account プロパティを LocalSystem に設定します。Set the Account property to LocalSystem from the drop-down list.

    この設定で、ローカル システム アカウントを使用してサービスがインストールされ、実行されます。This setting installs the service and runs it by using the local system account.

    重要

    LocalSystem アカウントには、イベント ログへの書き込みを含む、幅広いアクセス許可が設定されています。The LocalSystem account has broad permissions, including the ability to write to the event log. このアカウントは悪意のあるソフトウェアから攻撃されるリスクが高いため、使用する場合は注意が必要です。Use this account with caution, because it might increase your risk of attacks from malicious software. その他のタスクについては、ローカル コンピューターで非特権ユーザーとして機能し、リモート サーバーには匿名の資格情報を渡す LocalService アカウントの使用を検討してください。For other tasks, consider using the LocalService account, which acts as a non-privileged user on the local computer and presents anonymous credentials to any remote server. この例は、 LocalService アカウントを使用しようとすると失敗します。これは、イベント ログに書き込むアクセス許可が必要になるためです。This example fails if you try to use the LocalService account, because it needs permission to write to the event log.

インストーラーについて詳しくは、「方法: サービス アプリケーションにインストーラーを追加する」を参照してください。For more information about installers, see How to: Add installers to your service application.

(省略可能) スタートアップ パラメーターを設定する(Optional) Set startup parameters

注意

スタートアップ パラメーターを追加するよう決定する前に、これがサービスに情報を渡す最適な方法であるかどうかを検討してください。Before you decide to add startup parameters, consider whether it's the best way to pass information to your service. 使用や解析は簡単であり、ユーザーが簡単にオーバーライドできますが、ドキュメントなしでは検索や使用が困難である可能性があります。Although they're easy to use and parse, and a user can easily override them, they might be harder for a user to discover and use without documentation. 一般的に、サービスに必要なスタートアップ パラメーターが複数ある場合は、代わりにレジストリまたは構成ファイルの使用することをお勧めします。Generally, if your service requires more than just a few startup parameters, you should use the registry or a configuration file instead.

Windows サービスは、コマンド ライン引数 (スタートアップ パラメーター) を受け入れることができます。A Windows service can accept command-line arguments, or startup parameters. スタートアップ パラメーターを処理するコードを追加すると、ユーザーは、サービス プロパティ ウィンドウでカスタムのスタートアップ パラメーターを使用してサービスを開始できます。When you add code to process startup parameters, a user can start your service with their own custom startup parameters in the service properties window. ただし、これらのスタートアップ パラメーターは、次回のサービスの開始時には保持されません。However, these startup parameters aren't persisted the next time the service starts. スタートアップ パラメーターを永続的に設定するには、レジストリに設定します。To set startup parameters permanently, set them in the registry.

各 Windows サービスには、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services サブキー以下にレジストリ エントリがあります。Each Windows service has a registry entry under the HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services subkey. 各サービスのサブキーで、Parameters サブキーを使用してサービスがアクセスできる情報を格納します。Under each service's subkey, use the Parameters subkey to store information that your service can access. その他の種類のプログラムの場合と同じ方法で、Windows サービスに対してアプリケーション構成ファイルを使用できます。You can use application configuration files for a Windows service the same way you do for other types of programs. サンプル コードについては、「ConfigurationManager.AppSettings」を参照してください。For sample code, see ConfigurationManager.AppSettings.

スタートアップ パラメーターを追加するにはTo add startup parameters

  1. Program.cs または MyNewService.Designer.vb を選択してから、ショートカット メニューから [コードの表示] を選択します。Select Program.cs, or MyNewService.Designer.vb, then choose View Code from the shortcut menu. Main メソッドで、入力パラメーターを追加してサービス コンストラクターに渡すようにコードを変更します。In the Main method, change the code to add an input parameter and pass it to the service constructor:

    static void Main(string[] args)
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[]
        {
            new MyNewService(args)
        };
        ServiceBase.Run(ServicesToRun);
    }
    
    Shared Sub Main(ByVal cmdArgs() As String)
        Dim ServicesToRun() As System.ServiceProcess.ServiceBase = New System.ServiceProcess.ServiceBase() {New MyNewService(cmdArgs)}
        System.ServiceProcess.ServiceBase.Run(ServicesToRun)
    End Sub
    
  2. MyNewService.cs または MyNewService.vb で、次のように入力パラメーターを処理するように MyNewService コンストラクターを変更します。In MyNewService.cs, or MyNewService.vb, change the MyNewService constructor to process the input parameter as follows:

    using System.Diagnostics;
    
    public MyNewService(string[] args)
    {
        InitializeComponent();
    
        string eventSourceName = "MySource";
        string logName = "MyNewLog";
    
        if (args.Length > 0)
        {
           eventSourceName = args[0];
        }
    
        if (args.Length > 1)
        {
            logName = args[1];
        }
    
        eventLog1 = new EventLog();
    
        if (!EventLog.SourceExists(eventSourceName))
        {
            EventLog.CreateEventSource(eventSourceName, logName);
        }
    
        eventLog1.Source = eventSourceName;
        eventLog1.Log = logName;
    }
    
    Imports System.Diagnostics
    
    Public Sub New(ByVal cmdArgs() As String)
        InitializeComponent()
        Dim eventSourceName As String = "MySource"
        Dim logName As String = "MyNewLog"
        If (cmdArgs.Count() > 0) Then
            eventSourceName = cmdArgs(0)
        End If
        If (cmdArgs.Count() > 1) Then
            logName = cmdArgs(1)
        End If
        eventLog1 = New EventLog()
        If (Not EventLog.SourceExists(eventSourceName)) Then
            EventLog.CreateEventSource(eventSourceName, logName)
        End If
        eventLog1.Source = eventSourceName
        eventLog1.Log = logName
    End Sub
    

    このコードでは、ユーザーが指定したスタートアップ パラメーターに従ってイベント ソースとログ名を設定します。This code sets the event source and log name according to the startup parameters that the user supplies. 引数が指定されていない場合は、既定値が使用されます。If no arguments are supplied, it uses default values.

  3. コマンド ライン引数を指定するには、ProjectInstaller.cs または ProjectInstaller.vbProjectInstaller クラスに次のコードを追加します。To specify the command-line arguments, add the following code to the ProjectInstaller class in ProjectInstaller.cs, or ProjectInstaller.vb:

    protected override void OnBeforeInstall(IDictionary savedState)
    {
        string parameter = "MySource1\" \"MyLogFile1";
        Context.Parameters["assemblypath"] = "\"" + Context.Parameters["assemblypath"] + "\" \"" + parameter + "\"";
        base.OnBeforeInstall(savedState);
    }
    
    Protected Overrides Sub OnBeforeInstall(ByVal savedState As IDictionary)
        Dim parameter As String = "MySource1"" ""MyLogFile1"
        Context.Parameters("assemblypath") = """" + Context.Parameters("assemblypath") + """ """ + parameter + """"
        MyBase.OnBeforeInstall(savedState)
    End Sub
    

    通常、この値には Windows サービスの実行可能ファイルの完全なパスが含まれています。Typically, this value contains the full path to the executable for the Windows service. サービスが正しく開始されるには、ユーザーはパスと各パラメーターに引用符を付ける必要があります。For the service to start up correctly, the user must supply quotation marks for the path and each individual parameter. ユーザーは ImagePath レジストリ エントリのパラメーターを変更して、Windows サービスのスタートアップ パラメーターを変更できます。A user can change the parameters in the ImagePath registry entry to change the startup parameters for the Windows service. ただし、管理や構成のユーティリティを使用するなどして、プログラムで値を変更し、わかりやすい方法で機能を公開することをお勧めします。However, a better way is to change the value programmatically and expose the functionality in a user-friendly way, such as by using a management or configuration utility.

サービスをビルドするBuild the service

  1. ソリューション エクスプローラーで、MyNewService プロジェクトのショートカット メニューから [プロパティ] を選択します。In Solution Explorer, choose Properties from the shortcut menu for the MyNewService project.

    プロジェクトのプロパティ ページが表示されます。The property pages for your project appear.

  2. [アプリケーション] タブの [スタートアップ オブジェクト] 一覧で MyNewService.Program (Visual Basic プロジェクトの場合は Sub Main) を選択します。On the Application tab, in the Startup object list, choose MyNewService.Program, or Sub Main for Visual Basic projects.

  3. プロジェクトをビルドするには、ソリューション エクスプローラーで、プロジェクトのショートカット メニューから [ビルド] を選択します (または Ctrl+Shift+B キーを押します)。To build the project, in Solution Explorer, choose Build from the shortcut menu for your project (or press Ctrl+Shift+B).

サービスをインストールするInstall the service

Windows サービスを構築済みであるため、サービスをインストールできます。Now that you've built the Windows service, you can install it. Windows サービスをインストールするには、インストール先のコンピューター上の管理者資格情報が必要です。To install a Windows service, you must have administrator credentials on the computer where it's installed.

  1. 管理者資格情報を使用して、Visual Studio 用開発者コマンド プロンプトを開きます。Open Developer Command Prompt for Visual Studio with administrative credentials. Windows のスタート メニューから、Visual Studio フォルダーの [開発者コマンド プロンプト for VS 2017] を選択し、ショートカット メニューから [その他] > [管理者として実行] を選択します。From the Windows Start menu, select Developer Command Prompt for VS 2017 in the Visual Studio folder, then select More > Run as Administrator from the shortcut menu.

  2. [開発者コマンド プロンプト for Visual Studio] ウィンドウで、プロジェクトの出力を含むフォルダーに移動します (既定では、プロジェクトの \bin\Debug サブディレクトリです)。In the Developer Command Prompt for Visual Studio window, navigate to the folder that contains your project's output (by default, the \bin\Debug subdirectory of your project).

  3. 次のコマンドを入力します。Enter the following command:

    installutil MyNewService.exe
    

    サービスが正常にインストールされると、正常に実行されたことが報告されます。If the service installs successfully, the command reports success.

    システムで installutil.exe を見付けることができない場合は、コンピューター上に存在することを確認してください。If the system can't find installutil.exe, make sure that it exists on your computer. このツールは、.NET Framework と共に %windir%\Microsoft.NET\Framework[64]\<framework version> フォルダーにインストールされます。This tool is installed with the .NET Framework to the folder %windir%\Microsoft.NET\Framework[64]\<framework version>. たとえば、64 ビット バージョンでの既定のパスは %windir%\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe です。For example, the default path for the 64-bit version is %windir%\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe.

    installutil.exe プロセスが失敗する場合は、インストール ログを調べて理由を確認します。If the installutil.exe process fails, check the install log to find out why. 既定で、ログはサービスの実行可能ファイルと同じフォルダーにあります。By default, the log is in the same folder as the service executable. インストールは次の場合に失敗することがあります。The installation can fail if:

    • RunInstallerAttribute クラスが ProjectInstaller クラスに存在しない。The RunInstallerAttribute class isn't present on the ProjectInstaller class.
    • 属性が true に設定されていない。The attribute isn't set to true.
    • ProjectInstaller クラスが public として定義されていない。The ProjectInstaller class isn't defined as public.

詳細については、「方法 :サービスをインストールおよびアンインストールする」を参照してください。For more information, see How to: Install and uninstall services.

サービスを開始して実行するStart and run the service

  1. Windows で、 [サービス] デスクトップ アプリを開きます。In Windows, open the Services desktop app. Windows+R キーを押して [ファイル名を指定して実行] ボックスを開き、「services.msc」と入力して、Enter キーを押すか [OK] を選択します。Press Windows+R to open the Run box, enter services.msc, and then press Enter or select OK.

    [サービス] 内にサービスが一覧表示されます。サービスは、サービスに対して設定した表示名でアルファベット順に表示されます。You should see your service listed in Services, displayed alphabetically by the display name that you set for it.

    [サービス] ウィンドウの MyNewService。

  2. サービスを開始するには、サービスのショートカット メニューから [開始] を選択します。To start the service, choose Start from the service's shortcut menu.

  3. サービスを停止するには、サービスのショートカット メニューから [停止] を選択します。To stop the service, choose Stop from the service's shortcut menu.

  4. (省略可能) コマンド ラインから、コマンド net start <service name>net stop <service name> を使用して、サービスを開始または停止します。(Optional) From the command line, use the commands net start <service name> and net stop <service name> to start and stop your service.

サービスのイベント ログ出力を確認するVerify the event log output of your service

  1. Windows で、 [イベント ビューアー] デスクトップ アプリを開きます。In Windows, open the Event Viewer desktop app. Windows 検索バーに「イベント ビューアー」と入力し、検索結果から [イベント ビューアー] を選択します。Enter Event Viewer in the Windows search bar, and then select Event Viewer from the search results.

    ヒント

    Visual Studio でイベント ログにアクセスするには、 [表示] メニューからサーバー エクスプローラーを開き (または Ctrl+Alt+S キーを押し)、ローカル コンピューターの [イベント ログ] ノードを展開します。In Visual Studio, you can access event logs by opening Server Explorer from the View menu (or press Ctrl+Alt+S) and expanding the Event Logs node for the local computer.

  2. [イベント ビューアー] で、 [アプリケーションとサービス ログ] を展開します。In Event Viewer, expand Applications and Services Logs.

  3. MyNewLog (または、手順に従ってコマンド ライン引数を追加した場合は MyLogFile1) の一覧を見つけて展開します。Locate the listing for MyNewLog (or MyLogFile1 if you followed the procedure to add command-line arguments) and expand it. サービスが実行した 2 つの操作 (開始および停止) のエントリが表示されます。You should see the entries for the two actions (start and stop) that your service performed.

    イベント ビューアーを使用してイベント ログの項目を表示する

リソースをクリーンアップするClean up resources

Windows サービス アプリが不要になったら、削除することができます。If you no longer need the Windows service app, you can remove it.

  1. 管理者資格情報を使用して、Visual Studio 用開発者コマンド プロンプトを開きます。Open Developer Command Prompt for Visual Studio with administrative credentials.

  2. [開発者コマンド プロンプト for Visual Studio] ウィンドウで、プロジェクトの出力を含むフォルダーに移動します。In the Developer Command Prompt for Visual Studio window, navigate to the folder that contains your project's output.

  3. 次のコマンドを入力します。Enter the following command:

    installutil.exe /u MyNewService.exe
    

    サービスが正常にアンインストールされると、サービスが正常に削除されたことが報告されます。If the service uninstalls successfully, the command reports that your service was successfully removed. 詳細については、「方法 :サービスをインストールおよびアンインストールする」を参照してください。For more information, see How to: Install and uninstall services.

次の手順Next steps

サービスを作成したので、以下を実行できます。Now that you've created the service, you can:

  • 他のユーザーが Windows サービスのインストールに使用できるスタンドアロン セットアップ プログラムを作成します。Create a standalone setup program for others to use to install your Windows service. WiX ツールセットを使用して、Windows サービスのインストーラーを作成します。Use the WiX Toolset to create an installer for a Windows service. その他のアイデアについては、インストーラー パッケージの作成に関する記事を参照してください。For other ideas, see Create an installer package.

  • インストールしたサービスにコマンドを送信できる ServiceController コンポーネントの使用法を調べます。Explore the ServiceController component, which enables you to send commands to the service you've installed.

  • アプリケーションの実行時にイベント ログを作成するのではなく、アプリケーションのインストール時にインストーラーを使用してイベント ログを作成します。Instead of creating the event log when the application runs, use an installer to create an event log when you install the application. アプリケーションをアンインストールすると、イベント ログはインストーラーによって削除されます。The event log is deleted by the installer when you uninstall the application. 詳細については、EventLogInstaller を参照してください。For more information, see EventLogInstaller.

関連項目See also