準備
- 表示名 (DisplayName):サービス一覧などで「名前」に表示される名前(スペースを含んでもよいし、日本語も可)
- サービス名 (ServiceName):サービスの識別用の名前(英数字のみ。スペースなども含まない)
プロジェクトの作成
プロジェクトの新規作成で右上の検索ボックスに “サービス” と入力するのが一番手っ取り早い。
通常通り、デフォルトではプロジェクト名がサービスのexe名になるので、先に考えたサービス名を入力しておく。
ここでデザイナからインストーラクラスを追加することもできるが、コードで書いたほうが短くて使いやすいので、コード側で用意することにする。
Program.csの編集
Program.csを開く。
Mainメソッドはそのままでもかまわないが、なぜか冗長な書き方なので、下記のように変更する。
CanShutdown
をtrue
にしておくとPCがシャットダウンするときのイベントを拾うことができる。凝った作りにしない限り一時停止と再開はできなくてもいいと思うので、適宜CanPauseAndContinue
はfalse
にしておく。
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
があるのでこれもサービス名に統一しておく。
デザイナからコードビューに切り替えるとOnStart
とOnStop
が存在しているので、この中に開始時の処理と停止時の処理を書く。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パス"
でできる。