Windowsサービス関連記事
やりたいこと
以前、C#(.NET5)でサービスを作ったが、.NET6でも同じことができるんだろうとタカをくくっていたら、GUI(VisualStudio2022)のプロジェクトのテンプレートに、VisualStudio2019(.NET5)にあったワーカーサービス
のテンプレートがなくなっていた。
どないしたらええねんとなったので調べた。
やり方
dotnet new コマンドで使える、.NETの既定のテンプレート
を使用する。
前提
VisualStudio2022 / .NET6.0
手順
試しに、デスクトップに「TestSolution」フォルダを作り、さらにその中に「TestProject」フォルダを作成し、そこにWorkerのプロジェクトを作成してみることにする。
コマンドプロンプトを開いて、プロジェクトを作りたいフォルダにcdでまず移動する。
そこで、下記のコマンドを入力する。
dotnet new worker -f net6.0
そうすると、こんな感じになる。
フォルダの中には、下記のようなものができる。
この時点では、.csproj
ファイルはあるが、.sln
ファイルはない。
.csprojファイルをVisualStudio2022で開くと、いつものような感じでソリューションが開く。
この時点でもまだ.slnファイルはないが、「×」を押してVisualStudioを閉じようとしたときにソリューションを保存するか聞かれるので、そのときに保存を行うと、.slnファイルができる。
※その際にでる「名前を付けてファイルを保存」Dlgでは、デフォでは.csprojと同じ階層が表示されてる。
個人的に、.slnファイルは、
ソリューションのフォルダ
├─.xxx.sln
└─Projectのフォルダ
├─ test.csproj
├─ Program.cs.cs
・・・
みたいな感じになっててほしいので、.csprojの一個上の階層に.slnは保存する。
あとは、.NET5のときとほぼ同じ内容がプロジェクトの中にあるので、
下記のあたりに行いたい処理を書いていく。
サービスとして動かすときのメモ
やることは.NET5のときとほぼ同じだが、.NET6テンプレートだとtopレベルステートメントで書かれてたりして微妙にコードが違うので、一応program.csの編集部分をメモ。
→.NET5のときのメモ
using TestProject;
IHost host = Host.CreateDefaultBuilder(args)
.ConfigureServices(services =>
{
services.AddHostedService<Worker>();
}).UseWindowsService()//★ここを追加
.Build();
await host.RunAsync();
気づいたことメモ?
今回プロジェクトはdotnet newコマンド、ソリューションはVisualStudio2022で作ったが、もしかしたらソリューションをまずdotnetのコマンド(dotnet new sln
??)で作ってから、その中でdotnet new
をするのが正しいやり方なのかも?(未確認)
VisualStudioばかり使ってるので、dotnetコマンド使い慣れてない...
追記:VS2022でもWorkerサービスのテンプレートが使えた
VisualStudioInstallerで、「ASP.NETとWeb開発の必須コンポーネント」
というのをインストールしたら、VisualStudio2022のテンプレート選択の中に「ワーカーサービス」が出てきた。
プロジェクトのテンプレートは、インストールされると
C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\ProjectTemplates
の中に入るようで、今回のワーカーサービスは、上のをインストールすると下記に入った。
C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\ProjectTemplates\CSharp\Web\1033
置き場所のフォルダからすると、ワーカーサービスは、「Web開発」向けの様子。知らなかった。(Webサーバーとかを作るために使われるから??)
参考
dotnet new コマンドで使うworkerテンプレート
ターゲットバージョンの指定方法
英語の記事
.NET5でサービス作ったときのじぶんのメモ
テンプレートの保存場所
Workerのテンプレートをインストールできたきっかけの記事