Windowsサービスも
.NET Coreで作ろう
2020/7/29 須藤圭太
1
自己紹介
 ID:suusanex( connpass・Twitter・GitHub共通)
 名前:須藤圭太
 サイエンスパーク株式会社という独立系ソフトウェアベンダーに所属
 4年ほど受託開発で、上流から下流まで全部を回す
 ここ6年ほどは、自社製品開発を担当
 Windowsアプリ開発のネタが多い
 勉強会もやってます、最近はオンラインで
今日の内容
• そろそろ.NET Core
• Webアプリ(ASP.NET Core)の情報はたくさんある
• しかしデスクトップ開発では、Windowsサービスだってまだまだ現役
• .NET CoreでのWindowsサービスの作り方は?
3
Windowsサービスの種類
C++ ATL .NET FW .NET Core
特徴 最古。C++もしく
はC++/STLなので
生産性低。
.NETで生産性↑
Windowsサービス
特化。
より開発しやすく
Webサーバー等と
の統合
必要ライブラリ VC++ランタイム .NET FW .NET Core
インストール方法 CreateService .NET FW用インス
トーラ
CreateService
4
.NET Coreで作るWindowsサービス
 作り方のポイントを見せながら、優れている点をざっと解説します
5
サービスのテンプレートを選択
• .NET Coreの場合は、「Worker Service」を使用する
• VS2019のバージョンが少し古いと出てこない場合があるので、要アップデート
6
ただのワーカーとしてデバッグ可能
• この時点で、サービスではないがコンソールアプリとして起動可能
• デバッグに便利
Windowsサービス化:NuGet
• Windowsサービスとして使えるようにしていく
• まず、Hostingの拡張をNuGetで追加
8
Windowsサービス化:コード追加
• テンプレートに入っているIHostBuilderのコードに
• 次の1行を追加
• 完成!
9
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
});
.UseWindowsService()
IHostBuilderとは
• (大雑把な理解として)
• プロセスの下で動くもの(Windowsサービス、Webサーバー、ロガーなど)を
すべて同じI/Fで束ねる
• それらのDIや、共通のライフタイム管理を実現
• 正確なところはMSへ
• https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/host/generic-
host
10
IHostBuilderの便利なところ:複数ホス
トの管理
• 例えば、WindowsサービスとgRPCのホスト(サーバー)を同じプロセスで持ちたい
• CreateHostBuilderで両方を入れるだけ
• 同じI/Fでまとめてホストし、まとめて開始・終了処理をやってくれる 11
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
})
.UseWindowsService() //ここまでがWindowsサービス
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseUrls("http://localhost:51232");
webBuilder.UseStartup<Startup>();
}); //ここまでがgRPC
IHostBuilderの便利なところ:その他
• 組み込みのDIコンテナがあり、さっそくサービス全体で使える
• 組み込みでLoggerをまとめる仕組みがあり、Nlogなどを追加できる
12
まとめ
• .NET CoreでもWindowsサービスは作れる
• むしろ、.NET Frameworkより進化している
• デスクトップアプリも可能なところは.NET Coreへの対応を模索していきま
しょう
13

Windowsサービスも.NET Coreで作ろう