チュートリアル: Windows サービス アプリを作成する

警告

このドキュメントは、最新版の Windows サービスは対象としていません。 BackgroundService を使用した Windows サービスの最新のコンテンツと Worker サービス テンプレートについては、次を参照してください。

この記事では、イベント ログにメッセージを書き込む Windows サービス アプリを Visual Studio で作成する方法を示します。

サービスを作成する

最初に、プロジェクトを作成し、サービスが正しく機能するために必要な値を設定します。

  1. Visual Studio の [ファイル] メニューで [新規]>[プロジェクト] を選択して (または Ctrl+Shift+N キーを押して)、[新しいプロジェクト] ウィンドウを開きます。

  2. [Windows サービス (.NET Framework)] プロジェクト テンプレートを見つけて選択します。

    Note

    [Windows サービス] テンプレートが表示されない場合は、Visual Studio インストーラーを使って .NET デスクトップ開発ワークロードをインストールすることが必要である場合があります。

  3. [名前] に「MyNewService」と入力し、 [OK] を選択します。

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

    プロジェクト テンプレートには、System.ServiceProcess.ServiceBase から継承される Service1 という名前のコンポーネント クラスが含まれます。 それは、サービスを開始するコードなどの多数の基本的なサービス コードを含んでいます。

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

サービスの名前を Service1 から MyNewService に変更します。

  1. ソリューション エクスプローラーService1.cs または Service1.vb を選択し、ショートカット メニューから [名前の変更] を選択します。 ファイルの名前を MyNewService.cs または MyNewService.vb に変更し、Enter キーを押します

    コード要素 Service1 に対するすべての参照名を変更するかどうかを確認するポップアップ ウィンドウが表示されます。

  2. ポップアップ ウィンドウで [はい] を選択します。

    名前の変更のプロンプト

  3. [デザイン] タブで、ショートカット メニューから [プロパティ] を選択します。 [プロパティ] ウィンドウで ServiceName の値を MyNewService に変更します。

    サービスのプロパティ

  4. [ファイル] メニューから [すべて保存] を選択します。

サービスに機能を追加する

このセクションでは、Windows サービスにカスタム イベント ログを追加します。 Windows サービスに追加できるコンポーネントの種類の例として、EventLog コンポーネントを使用しています。

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

  1. ソリューション エクスプローラーで、MyNewService.cs または MyNewService.vb のショートカット メニューから [デザイナーの表示] を選択します。

  2. [ツールボックス][コンポーネント] を展開し、EventLog コンポーネントを [Service1.cs [デザイン]] タブまたは [Service1.vb [デザイン]] タブにドラッグします。

  3. ソリューション エクスプローラーで、MyNewService.cs または MyNewService.vb のショートカット メニューから [コードの表示] を選択します。

  4. カスタム イベント ログを定義します。

    C# の場合は、次のコード スニペットに示すように、既存の MyNewService() コンストラクターを編集します。 Visual Basic の場合は、次のコード スニペットに示すように、New() コンストラクターを追加します。

    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.csusing ステートメントを追加する (まだ存在しない場合) か、MyNewService.vbImports ステートメントを追加します。

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

サービスの開始時の処理を定義する

MyNewService.cs または MyNewService.vb のコード エディターで、OnStart メソッドを見つけます。 プロジェクトの作成時に、Visual Studio によって空のメソッド定義が自動的に作成されます。 サービスの開始時にイベント ログに対するエントリを記述するコードを追加します。

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

ポーリング

サービス アプリケーションは長期間実行するように設計されているため、通常は、(OnStart メソッドの設定に従って) システムをポーリングまたは監視しています。 OnStart メソッドは、サービスの操作が開始された後にオペレーティング システムに戻る必要があります。そのため、システムはブロックされません。

単純なポーリング メカニズムを設定するには、System.Timers.Timer コンポーネントを使用します。 このタイマーによって、定期的な間隔で Elapsed イベントが発生します。サービスは、イベントが発生するごとに監視を実行できます。 Timer コンポーネントは次のように使用します。

  • MyNewService.OnStart メソッドで Timer コンポーネントのプロパティを設定します。
  • Start メソッドを呼び出して、タイマーを開始します。
ポーリング メカニズムを設定する
  1. System.Timers 名前空間について、MyNewService.cs には using ステートメントを追加し、MyNewService.vb には Imports ステートメントを追加します。

    using System.Timers;
    
    Imports System.Timers
    
  2. MyNewService.OnStart イベントに次のコードを追加して、ポーリング メカニズムを設定します。

    // 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()
    
  3. MyNewService クラスにメンバー変数を追加します。 それには、イベント ログに書き込まれる次のイベントの識別子が含まれます。

    private int eventId = 1;
    
    Private eventId As Integer = 1
    
  4. MyNewService クラスに Timer.Elapsed イベントを処理する OnTimer メソッドを追加します。

    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
    

すべての作業をメイン スレッド上で実行する代わりに、バックグラウンド ワーカー スレッドを使用してタスクを実行できます。 詳細については、「System.ComponentModel.BackgroundWorker」を参照してください。

サービスの停止時の処理を定義する

サービスの停止時にイベント ログに対するエントリを追加するコード行を OnStop に挿入します。

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

サービスに対して他の処理を定義する

OnPauseOnContinue、および OnShutdown の各メソッドをオーバーライドして、コンポーネントの処理をさらに定義できます。

次のコードは、MyNewService クラスで OnContinue メソッドをオーバーライドする方法を示しています。

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

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

サービスは、その状態をサービス コントロール マネージャーに報告します。これによりユーザーは、サービスが正常に機能しているかどうかを確認することができます。 既定では、ServiceBase から継承したサービスは、SERVICE_STOPPED、SERVICE_PAUSED、および SERVICE_RUNNING など、限られたセットの状態設定を報告します。 サービスの開始に時間がかかる場合は、SERVICE_START_PENDING 状態を報告すると便利です。

Windows SetServiceStatus 関数を呼び出すコードを追加することで、SERVICE_START_PENDING および SERVICE_STOP_PENDING 状態設定を実装できます。

サービス保留の状態を実装する

  1. System.Runtime.InteropServices 名前空間について、MyNewService.cs には using ステートメントを追加し、MyNewService.vb には Imports ステートメントを追加します。

    using System.Runtime.InteropServices;
    
    Imports System.Runtime.InteropServices
    
  2. MyNewService.cs または MyNewService.vb に次のコードを追加して、ServiceState の値を宣言し、プラットフォーム呼び出しで使用する状態の構造を追加します。

    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
    

    Note

    サービス コントロール マネージャーは、SERVICE_STATUS 構造体dwWaitHint メンバーと dwCheckpoint メンバーを使って、Windows サービスの開始やシャットダウンまでの待機時間を判断します。 OnStart メソッドと OnStop メソッドが長時間実行している場合、サービスは、インクリメントした dwCheckPoint 値で SetServiceStatus をもう一度呼び出すことによって、追加の時間を要求できます。

  3. MyNewService クラスで、プラットフォーム呼び出しを使用して、SetServiceStatus 関数を宣言します。

    [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 メソッドの先頭に次のコードを追加します。

    // 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 に設定するコードを追加します。

    // 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 メソッドでこの手順を繰り返します。 SERVICE_STOP_PENDING 状態を実装し、OnStop メソッドが終了する前に SERVICE_STOPPED 状態を返します。

    次に例を示します。

    // 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)
    

サービスにインストーラーを追加する

Windows サービスを実行するには、まず、サービスをインストールする必要があります。これにより、サービスがサービス コントロール マネージャーに登録されます。 登録の詳細を処理するインストーラーをプロジェクトに追加します。

  1. ソリューション エクスプローラーで、MyNewService.cs または MyNewService.vb のショートカット メニューから [デザイナーの表示] を選択します。

  2. [デザイン] ビューでバックグラウンド領域を選択し、ショートカット メニューから [インストーラーの追加] を選択します。

    Visual Studio の既定では、2 つのインストーラーを含む ProjectInstaller というコンポーネント クラスがプロジェクトに追加されます。 これらのインストーラーはサービス用とサービスの関連プロセス用です。

  3. [ProjectInstaller][デザイン] ビューで、 [serviceInstaller1] (Visual C# プロジェクトの場合) または [ServiceInstaller1] (Visual Basic プロジェクトの場合) を選択してから、ショートカット メニューから [プロパティ] を選択します。

  4. [プロパティ] ウィンドウで、ServiceName プロパティが MyNewService に設定されていることを確認します。

  5. サンプル サービスなどのテキストを Description プロパティに追加します。

    このテキストは [サービス] ウィンドウの [説明] 列に表示され、サービスに関する説明をユーザーに示します。

    サービス ウィンドウのサービスの説明

  6. DisplayName プロパティにテキストを追加します。 たとえば、MyNewService Display Name です。

    このテキストは、 [サービス] ウィンドウの [表示名] 列に表示されます。 この名前は、システムによって使用される (たとえば、ServiceName コマンドを使用してサービスを開始する場合) 名前である net start プロパティとは異なる名前にすることができます。

  7. ドロップダウン リストから StartType プロパティを Automatic に設定します。

  8. 完了すると、 [プロパティ] ウィンドウは次の図のようになります。

    Windows サービスのインストーラー プロパティ

  9. [ProjectInstaller][デザイン] ビューで、 [serviceProcessInstaller1] (Visual C# プロジェクトの場合) または [ServiceProcessInstaller1] (Visual Basic プロジェクトの場合) を選択してから、ショートカット メニューから [プロパティ] を選択します。 ドロップダウン リストから Account プロパティを LocalSystem に設定します。

    この設定で、ローカル システム アカウントを使用してサービスがインストールされ、実行されます。

    重要

    LocalSystem アカウントには、イベント ログへの書き込みを含む、幅広いアクセス許可が設定されています。 このアカウントは悪意のあるソフトウェアから攻撃されるリスクが高いため、使用する場合は注意が必要です。 その他のタスクについては、ローカル コンピューターで非特権ユーザーとして機能し、リモート サーバーには匿名の資格情報を渡す LocalService アカウントの使用を検討してください。 この例は、 LocalService アカウントを使用しようとすると失敗します。これは、イベント ログに書き込むアクセス許可が必要になるためです。

インストーラーについて詳しくは、「方法: サービス アプリケーションにインストーラーを追加する」を参照してください。

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

Note

スタートアップ パラメーターを追加するよう決定する前に、これがサービスに情報を渡す最適な方法であるかどうかを検討してください。 使用や解析は簡単であり、ユーザーが簡単にオーバーライドできますが、ドキュメントなしでは検索や使用が困難である可能性があります。 一般的に、サービスに必要なスタートアップ パラメーターが複数ある場合は、代わりにレジストリまたは構成ファイルの使用することをお勧めします。

Windows サービスは、コマンド ライン引数 (スタートアップ パラメーター) を受け入れることができます。 スタートアップ パラメーターを処理するコードを追加すると、ユーザーは、サービス プロパティ ウィンドウでカスタムのスタートアップ パラメーターを使用してサービスを開始できます。 ただし、これらのスタートアップ パラメーターは、次回のサービスの開始時には保持されません。 スタートアップ パラメーターを永続的に設定するには、レジストリに設定します。

各 Windows サービスには、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services サブキー以下にレジストリ エントリがあります。 各サービスのサブキーで、Parameters サブキーを使用してサービスがアクセスできる情報を格納します。 その他の種類のプログラムの場合と同じ方法で、Windows サービスに対してアプリケーション構成ファイルを使用できます。 サンプル コードについては、「ConfigurationManager.AppSettings」を参照してください。

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

  1. Program.cs または MyNewService.Designer.vb を選択してから、ショートカット メニューから [コードの表示] を選択します。 Main メソッドで、入力パラメーターを追加してサービス コンストラクターに渡すようにコードを変更します。

    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 コンストラクターを変更します。

    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
    

    このコードでは、ユーザーが指定したスタートアップ パラメーターに従ってイベント ソースとログ名を設定します。 引数が指定されていない場合は、既定値が使用されます。

  3. コマンド ライン引数を指定するには、ProjectInstaller.cs または ProjectInstaller.vbProjectInstaller クラスに次のコードを追加します。

    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 サービスの実行可能ファイルの完全なパスが含まれています。 サービスが正しく開始されるには、ユーザーはパスと各パラメーターに引用符を付ける必要があります。 ユーザーは ImagePath レジストリ エントリのパラメーターを変更して、Windows サービスのスタートアップ パラメーターを変更できます。 ただし、管理や構成のユーティリティを使用するなどして、プログラムで値を変更し、わかりやすい方法で機能を公開することをお勧めします。

サービスをビルドする

  1. ソリューション エクスプローラーで、MyNewService プロジェクトのショートカット メニューから [プロパティ] を選択します。

    プロジェクトのプロパティ ページが表示されます。

  2. [アプリケーション] タブの [スタートアップ オブジェクト] 一覧で MyNewService.Program (Visual Basic プロジェクトの場合は Sub Main) を選択します。

  3. プロジェクトをビルドするには、ソリューション エクスプローラーで、プロジェクトのショートカット メニューから [ビルド] を選択します (または Ctrl+Shift+B キーを押します)。

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

Windows サービスを構築済みであるため、サービスをインストールできます。 Windows サービスをインストールするには、インストール先のコンピューター上の管理者資格情報が必要です。

  1. 管理者資格情報を使用して、Visual Studio 用開発者コマンド プロンプトを開きます。

  2. [開発者コマンド プロンプト for Visual Studio] で、プロジェクトの出力を含むフォルダーに移動します (既定では、プロジェクトの \bin\Debug サブディレクトリです)。

  3. 次のコマンドを入力します。

    installutil MyNewService.exe
    

    サービスが正常にインストールされると、正常に実行されたことが報告されます。

    システムで installutil.exe を見付けることができない場合は、コンピューター上に存在することを確認してください。 このツールは、.NET Framework と共に "%windir%\Microsoft.NET\Framework[64]\<フレームワーク バージョン>" フォルダーにインストールされます。 たとえば、64 ビット バージョンでの既定のパスは %windir%\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe です。

    installutil.exe プロセスが失敗する場合は、インストール ログを調べて理由を確認します。 既定で、ログはサービスの実行可能ファイルと同じフォルダーにあります。 インストールは次の場合に失敗することがあります。

    • RunInstallerAttribute クラスが ProjectInstaller クラスに存在しない。
    • 属性が true に設定されていない。
    • ProjectInstaller クラスが public として定義されていない。

詳細については、サービスをインストールおよびアンインストールする」を参照してください。

サービスを開始して実行する

  1. Windows で、 [サービス] デスクトップ アプリを開きます。 Windows+R キーを押して [ファイル名を指定して実行] ボックスを開き、「services.msc」と入力して、Enter キーを押すか [OK] を選択します。

    [サービス] 内にサービスが一覧表示されます。サービスは、サービスに対して設定した表示名でアルファベット順に表示されます。

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

  2. サービスを開始するには、サービスのショートカット メニューから [開始] を選択します。

  3. サービスを停止するには、サービスのショートカット メニューから [停止] を選択します。

  4. (省略可能) コマンド ラインから、コマンド net start service name> と > を使用して、サービスを開始または停止します。

サービスのイベント ログ出力を確認する

  1. Windows で、 [イベント ビューアー] デスクトップ アプリを開きます。 Windows 検索バーに「イベント ビューアー」と入力し、検索結果から [イベント ビューアー] を選択します。

    ヒント

    Visual Studio でイベント ログにアクセスするには、[表示] メニューからサーバー エクスプローラーを開き (または Ctrl+Alt+S キーを押し)、ローカル コンピューターの [イベント ログ] ノードを展開します。

  2. [イベント ビューアー] で、 [アプリケーションとサービス ログ] を展開します。

  3. MyNewLog (または、手順に従ってコマンド ライン引数を追加した場合は MyLogFile1) の一覧を見つけて展開します。 サービスが実行した 2 つの操作 (開始および停止) のエントリが表示されます。

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

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

Windows サービス アプリが不要になったら、削除することができます。

  1. 管理者資格情報を使用して、Visual Studio 用開発者コマンド プロンプトを開きます。

  2. [開発者コマンド プロンプト for Visual Studio] ウィンドウで、プロジェクトの出力を含むフォルダーに移動します。

  3. 次のコマンドを入力します。

    installutil.exe /u MyNewService.exe
    

    サービスが正常にアンインストールされると、サービスが正常に削除されたことが報告されます。 詳細については、サービスをインストールおよびアンインストールする」を参照してください。

次の手順

サービスを作成したので、以下を実行できます。

  • 他のユーザーが Windows サービスのインストールに使用できるスタンドアロン セットアップ プログラムを作成します。 WiX ツールセットを使用して、Windows サービスのインストーラーを作成します。 その他のアイデアについては、インストーラー パッケージの作成に関する記事を参照してください。

  • インストールしたサービスにコマンドを送信できる ServiceController コンポーネントの使用法を調べます。

  • アプリケーションの実行時にイベント ログを作成するのではなく、アプリケーションのインストール時にインストーラーを使用してイベント ログを作成します。 アプリケーションをアンインストールすると、イベント ログはインストーラーによって削除されます。 詳細については、「EventLogInstaller」を参照してください。

関連項目