C# でひとつのソリューションの中に複数のプロジェクトがあるのはよくあると思います。そしてTarget framework のデフォルトの言語のバージョンを上位バージョンにあげることってよくありますよね。
今回は「Directory.Build.props で指定することでソリューション内のプロジェクトを一括で管理できてといいぞ」って話です。csproj で指定する方法も合わせて書いておきます。
予備知識
今回は、.NET Core 3.x のプロジェクト (言語バージョンのデフォルトは 8.0) を 9.0 にあげる例で話を進めます。ほかのフレームワークのデフォルトバージョンや、指定できるバージョンの文字列の一覧は以下のドキュメントに書いてます。
csproj でバージョンを指定する (微妙 💀)
各プロジェクトの .csproj
ファイルを開いて、以下のように <LangVersion>9.0</LangVersion>
を追加してあげることができます。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp3.1</TargetFramework> <LangVersion>9.0</LangVersion> </PropertyGroup> </Project>
これだと、単一のプロジェクトならいいけど、プロジェクトがたーーーーくさんあると管理がめんどくさくて微妙なのでおすすめできません。
Directory.Build.props でバージョンを指定する (Good 👍)
まず、ソリューションの直下に "Directory.Build.props" というファイルを追加します。
VS 2019 でファイルを追加したあと、ソリューションエクスプローラーからは "Solution Items" の中に入っているように見えますがファイルが直下にあれば問題ありません。
あとは Directory.Build.props の中身を以下のようにします。既存でファイルが存在してる場合はその構造を破壊しないように良しなに LangVersion
を追加しましょう。Directory.Build.props はソリューション全体に影響するファイルなので、おかしなことをすると全てのプロジェクトを死に至らせる破壊力はあります。
<Project> <PropertyGroup> <LangVersion>9.0</LangVersion> </PropertyGroup> </Project>
これで、例えば .NET Core 3.1 のコンソールアプリでも C# 9.0 の構文で以下図のように書けるのですが、画面からエラーが出たままの場合があります。その場合は Visual Studio の表示がおかしいだけなので、VS を再起動しましょう。正しい設定ができていればエラーは消えます。
余談ですが、Directory.Build.props で LangVersion
を指定した後、csproj でも LangVersion
を指定してみたら csproj の方で読み込まれました。
まとめ
"Directory.Build.props" はほかにも色々設定ができますが、そもそも Directory.Build.props ってなんぞやとか一緒にでてくる "Directory.Build.targets" については以下のドキュメントを読むとよいと思います。
そいえばまだ一度も VS 2022 使ってなくて VS 2019 のままなんだよなーそろそろ変えようかしらと思った今日この頃でした。