C#でWindowsサービス開発のはじめ方

準備

  • 表示名 (DisplayName):サービス一覧などで「名前」に表示される名前(スペースを含んでもよいし、日本語も可)
  • サービス名 (ServiceName):サービスの識別用の名前(英数字のみ。スペースなども含まない)

プロジェクトの作成

プロジェクトの新規作成で右上の検索ボックスに “サービス” と入力するのが一番手っ取り早い。

通常通り、デフォルトではプロジェクト名がサービスのexe名になるので、先に考えたサービス名を入力しておく。

ここでデザイナからインストーラクラスを追加することもできるが、コードで書いたほうが短くて使いやすいので、コード側で用意することにする。

Program.csの編集

Program.csを開く。

Mainメソッドはそのままでもかまわないが、なぜか冗長な書き方なので、下記のように変更する。

CanShutdowntrueにしておくとPCがシャットダウンするときのイベントを拾うことができる。凝った作りにしない限り一時停止と再開はできなくてもいいと思うので、適宜CanPauseAndContinuefalseにしておく。

static void Main(string[] args)
{
    ServiceBase.Run(new SKYMAgentService()
    {
        CanShutdown = true,
        CanPauseAndContinue = false,
    });
}

Programクラスの下に下記のProjectInstallerクラスを追加する(誤ってProgramクラスの中に書かないこと)。当然別ファイルに分けてもよい。

[RunInstaller(true)]
public class ProjectInstaller : Installer
{
    public ProjectInstaller()
    {
        var spi = new ServiceProcessInstaller
        {
            Account = ServiceAccount.LocalSystem
        };
        var si = new ServiceInstaller
        {
            ServiceName = "サービス名",
            DisplayName = "表示名",
            Description = "サービスの説明",
            StartType = ServiceStartMode.Automatic,
        };
        this.Installers.Add(spi);
        this.Installers.Add(si);
    }
}

Serviceクラスの実装

Service1.csのデザイナのプロパティにServiceNameがあるのでこれもサービス名に統一しておく。

デザイナからコードビューに切り替えるとOnStartOnStopが存在しているので、この中に開始時の処理と停止時の処理を書く。OnShutdownが必要な場合は下記のように追加する。

protected override void OnShutdown()
{
    server.Stop();
}

あとはビルドすればbin\Debugかbin\Releaseにexeが生成される。

インストールとアンインストール

インストールとアンインストールにはInstalUtil.exeを使う。このコマンドはVSにパスの通ったコマンドプロンプトでないといけないので、スタート→プログラム→VS→Visual Studio コマンドプロンプトを管理者権限で起動する。

cd "exeのあるフォルダ"
installutil "exeパス"

でインストールできる。ちなみにアンインストールはinstallutil /u "exeパス"でできる。

参考

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です