Windowsサービスを楽に開発~TopShelf~
2014年3月23日 コメントを残す
0.前置き
Windowsサービスの開発に利用できるTopShelfという.NETのライブラリーを紹介します。
TopShelfを利用すれば、Windowsサービスのテストとインストールが実施しやすくなります。
ポイントとしては以下の2つがあります。
・コンソールアプリケーションとしてテストを実施できる。
・InstallUtilを利用しなくても簡易にSCMにインストールができる。
というわけで、サンプルを書きながら細かいことは説明します。
1.TopShelfの紹介
TopShelfはOSSで開発されているWindowsサービス構築用のライブラリーです。
Windowsサービス開発に必要となる、テスト支援、設定支援、インストール支援などを
主な機能として持っています。
プロジェクトのサイトはこちら(TopShelf Project)です。
GitHubでの開発はこちら(Topshelf / Topshelf)です。
2.インストール
VisualStudioで開発します。
プロジェクトは「コンソールアプリケーション」を利用ます。
そのあとNuGetで「TopShelf」パッケージを追加してください。
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を押して、デバッグ実行してみます。
ただのコンソールアプリケーションのように実行できます。
(ここが便利!)
インストール
インストールしてみます。
ビルド後に生成されるEXEの引数に「install」オプションを付ければよいです。
TopShelfSample.exe install
結果、下記のイメージのようにサービスをインストールできました。
この状態で「開始」を押下すればサービスとして実行されます。
実行結果は下記の通り。
4.サンプルを書いてみての補足
Windowsサービスに対する設定は他にもいくつか実施できます。
・スタートアップの種類(自動/手動/遅延起動)
・ログオンアカウント(実行アカウント)の種類
・依存関係の設定(サービス名を指定できる)
(SQL Serverが起動していないと、起動してはダメとか)
詳しくは、Configuring Topshelfを読むと良いです。
5.サンプルコード
今回作ったサンプルはGitHubにホスティングしてあります。
TopShelfのサンプルアプリケーション
6.最後に
これを使うととにかくデバッグが楽です。
ちょっと前から使ってましたけど、日本語の情報がなかったので書いてみました。
ぜひ試してみてください。