Windows Serviceの作り方


タイマーオブジェクトを使ってWindowsサービスを作ってみたので作り方のメモ



1.アプリケーションの種類をWindowsサービスにしてプロジェクトを作成する


2.Service1.vbのデザイナでタイマーを追加する。
なお、タイマーオブジェクトはWindowsFormのものは使ってはいけない。    System.Timersのタイマーを使用すること。
(→WindowsFormだとサービスで起動したときに動かない)


System.Timersは標準のツールボックスにはないので以下の手順で追加する必要 がある

「ツールボックス」→空いている箇所を右クリック→「アイテムの選択」
→「.NET Framework コンポーネント」で「System.Timers」を追加


3.追加したタイマーのEnabledプロパティをFalseにする



4.以下のコードのようにサービスのイベントとタイマーのイベントを記述

    Protected Overrides Sub OnStart(ByVal args() As String)
        ' サービスを開始するコードをここに追加します。このメソッドによって、
        ' サービスが正しく実行されるようになります

        'このスリープはなくてもよい
        'デバッグしたいときのプロセスにアタッチし易いようにするための記述
        System.Threading.Thread.Sleep(10000)


        ' タイマー開始
        ' ※このイベントの中に処理を記述すると、その処理が終わるまでサービスが開始状態とならないので
        '   タイマーの制御以外の処理は記述しないこと!!
        Timer1.Enabled = True
        Timer1.InterVal = 100

    End Sub

    Protected Overrides Sub OnStop()

        ' サービスを停止するのに必要な終了処理を実行するコードをここに追加します。

        'タイマー無効
        Timer1.Enabled = False

    End Sub


    Private Sub Timer1_Elapsed(ByVal sender As System.Object, _
                               ByVal e As System.Timers.ElapsedEventArgs) Handles Timer1.Elapsed

        'タイマーのイベントが重複起動しないようにタイマーを無効にする
        Timer1.Enabled = False

        '↓★以下、サービスで実現したい機能を記述
        '
        '
        '

    End Sub

処理の流れは「OnStartイベントでタイマーを有効に」→「タイマーのElapsedイベントで処理を記述(Elapsedイベントが2回目以降発生しないようにEnabledをFalseに)」といった感じ。


OnStartイベント内でサービスで実現したい処理を書くと
その処理が終わるまでサービスが開始しきれないため、このようにタイマーを使った方がよいみたい。



上記でサービスの実装は完了だがステップ実行をするには
一度インストーラを作成してWindowsにサービスを登録、
その後実行したサービスのプロセスにアタッチする必要がある。



インストーラの作成は以下のサイトを参考に

http://homepage2.nifty.com/nonnon/Chinamini/20080923.html

なお、サービスをインストールするときの実行ユーザにはマシン名もつける必要があるので注意
例:HogePc\administrator



ステップ実行をするにはサービスを開始してVSから「ツール」→「プロセスにアタッチ」をすることによって可能となる。
(OnStartイベントでスリープさせているのは、アタッチし易くするため)




動作確認環境:Visual Stadio 2010,Windows XP