C#でサービスを作る(.NET6.0)

# Windowsサービス関連記事

https://tera1707.com/entry/2022/02/06/144447#WindowsService

# やりたいこと

以前、[C#(.NET5)でサービスを作った](https://qiita.com/tera1707/items/0127893b1f11216e16d8)が、.NET6でも同じことができるんだろうとタカをくくっていたら、GUI(VisualStudio2022)のプロジェクトのテンプレートに、VisualStudio2019(.NET5)にあった`ワーカーサービス`のテンプレートがなくなっていた。

VS2019
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/5b294925-5afc-badb-4b73-dad2195838ba.png)
VS2022
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/9ac4110f-4661-fb62-9f14-2f761fdd3d25.png)

どないしたらええねんとなったので調べた。

# やり方

`dotnet new コマンドで使える、.NETの既定のテンプレート`を使用する。

# 前提

VisualStudio2022 / .NET6.0

# 手順

試しに、デスクトップに「TestSolution」フォルダを作り、さらにその中に「TestProject」フォルダを作成し、そこにWorkerのプロジェクトを作成してみることにする。

コマンドプロンプトを開いて、プロジェクトを作りたいフォルダにcdでまず移動する。
そこで、下記のコマンドを入力する。

`dotnet new worker -f net6.0`

そうすると、こんな感じになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/1ba6c520-c326-2707-ce7b-78a01a1e2274.png)
フォルダの中には、下記のようなものができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/3baa6910-2880-41ef-f906-2323931f2222.png)
この時点では、`.csproj`ファイルはあるが、`.sln`ファイルはない。

.csprojファイルをVisualStudio2022で開くと、いつものような感じでソリューションが開く。
この時点でもまだ.slnファイルはないが、「×」を押してVisualStudioを閉じようとしたときにソリューションを保存するか聞かれるので、そのときに保存を行うと、.slnファイルができる。

※その際にでる「名前を付けてファイルを保存」Dlgでは、デフォでは.csprojと同じ階層が表示されてる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/a6e56edc-be3d-19dd-6cd2-fc06adeb1233.png)
個人的に、.slnファイルは、

```
ソリューションのフォルダ
├─.xxx.sln
└─Projectのフォルダ
　├─ test.csproj
　├─ Program.cs.cs
　　・・・
```

みたいな感じになっててほしいので、.csprojの一個上の階層に.slnは保存する。

---

あとは、.NET5のときとほぼ同じ内容がプロジェクトの中にあるので、
下記のあたりに行いたい処理を書いていく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/cf9e28fd-c771-ccb0-bc77-13dc76ca778d.png)

# サービスとして動かすときのメモ

やることは.NET5のときとほぼ同じだが、.NET6テンプレートだとtopレベルステートメントで書かれてたりして微妙にコードが違うので、一応program.csの編集部分をメモ。
→[.NET5のときのメモ](https://qiita.com/tera1707/items/0127893b1f11216e16d8)

```program.cs
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のテンプレート選択の中に「ワーカーサービス」が出てきた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/9270b98d-c37d-d909-7870-4b0e57a03560.png)

プロジェクトのテンプレートは、インストールされると
`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テンプレート

https://docs.microsoft.com/ja-jp/dotnet/core/tools/dotnet-new-sdk-templates#worker-grpc

ターゲットバージョンの指定方法

https://docs.microsoft.com/ja-jp/dotnet/standard/frameworks

英語の記事

https://www.telerik.com/blogs/dotnet-worker-service-working-hard-so-you-dont-have-to

.NET5でサービス作ったときのじぶんのメモ

https://qiita.com/tera1707/items/0127893b1f11216e16d8

テンプレートの保存場所

https://docs.microsoft.com/en-us/visualstudio/ide/how-to-locate-and-organize-project-and-item-templates?view=vs-2022#installed-templates

Workerのテンプレートをインストールできたきっかけの記事

https://stackoverflow.com/questions/70460404/visual-studio-2022-worker-service