Windowsサービスを楽に開発~TopShelf~

0.前置き

Windowsサービスの開発に利用できるTopShelfという.NETのライブラリーを紹介します。
TopShelfを利用すれば、Windowsサービスのテストとインストールが実施しやすくなります。
ポイントとしては以下の2つがあります。

・コンソールアプリケーションとしてテストを実施できる。
・InstallUtilを利用しなくても簡易にSCMにインストールができる。

というわけで、サンプルを書きながら細かいことは説明します。

1.TopShelfの紹介

TopShelfはOSSで開発されているWindowsサービス構築用のライブラリーです。
Windowsサービス開発に必要となる、テスト支援、設定支援、インストール支援などを
主な機能として持っています。

プロジェクトのサイトはこちら(TopShelf Project)です。
GitHubでの開発はこちら(Topshelf / Topshelf)です。

2.インストール

VisualStudioで開発します。
プロジェクトは「コンソールアプリケーション」を利用ます。
そのあとNuGetで「TopShelf」パッケージを追加してください。

nuget

3.実際に使ってみる

下記の通りサンプルを作りました。
1秒(1000ms)ごとにログ(”I am fine”)を出力するプログラムです。

「Program.cs」以下の通り。

using Topshelf;

namespace TopShelfSample
{
    public class Program
    {
        public static void Main()
        {
            HostFactory.Run(x =>
            {
                //ロジックがあるクラスへの参照
                x.Service<Beat>(s =>
                {
                    s.ConstructUsing(name => new Beat());
                    s.WhenStarted(tc => tc.Start());
                    s.WhenStopped(tc => tc.Stop());
                });
                
                //Windowsサービスの設定
                x.RunAsLocalSystem();
                x.SetDescription("Just beating program");
                x.SetDisplayName("BeatingProgram");
                x.SetServiceName("BeatingService");
            });
        }
    }
}

ロジックが入っているクラスは以下の通り「Beat.cs」。

using System.Timers;
using NLog;

namespace TopShelfSample
{
    public class Beat
    {
        private readonly Timer _timer;
        private readonly Logger _logger = LogManager.GetCurrentClassLogger();
        public Beat()
        {
            _timer = new Timer(1000)
            {
                AutoReset = true
            };
            _timer.Elapsed += (sender, eventArgs) => _logger.Info("I am fine");
        }
        public void Start() { _timer.Start(); }
        public void Stop() { _timer.Stop(); }
    }
}

デバッグ実行
VisualStudioでF5を押して、デバッグ実行してみます。
ただのコンソールアプリケーションのように実行できます。
(ここが便利!)

console

インストール
インストールしてみます。
ビルド後に生成されるEXEの引数に「install」オプションを付ければよいです。

TopShelfSample.exe install

結果、下記のイメージのようにサービスをインストールできました。

service

この状態で「開始」を押下すればサービスとして実行されます。
実行結果は下記の通り。

log

4.サンプルを書いてみての補足

Windowsサービスに対する設定は他にもいくつか実施できます。
・スタートアップの種類(自動/手動/遅延起動)
・ログオンアカウント(実行アカウント)の種類
・依存関係の設定(サービス名を指定できる)
 (SQL Serverが起動していないと、起動してはダメとか)
詳しくは、Configuring Topshelfを読むと良いです。

5.サンプルコード

今回作ったサンプルはGitHubにホスティングしてあります。
TopShelfのサンプルアプリケーション

6.最後に

これを使うととにかくデバッグが楽です。
ちょっと前から使ってましたけど、日本語の情報がなかったので書いてみました。
ぜひ試してみてください。

コメントを残す

  • WordPress.com で次のようなサイトをデザイン
    始めてみよう