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」以下の通り。
[sourcecode language=”csharp”]
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");
});
}
}
}
[/sourcecode]

ロジックが入っているクラスは以下の通り「Beat.cs」。
[sourcecode language=”csharp”]
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(); }
}
}
[/sourcecode]
デバッグ実行
VisualStudioでF5を押して、デバッグ実行してみます。
ただのコンソールアプリケーションのように実行できます。
(ここが便利!)

console

インストール
インストールしてみます。
ビルド後に生成されるEXEの引数に「install」オプションを付ければよいです。
[sourcecode]
TopShelfSample.exe install
[/sourcecode]
結果、下記のイメージのようにサービスをインストールできました。

service

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

log

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

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

5.サンプルコード

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

6.最後に

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