■ 結論1
こんな感じでしょうか。
.NET Framework 派にも使ってもらいたい場合。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>netstandard2.0</TargetFrameworks> <LangVersion>12.0</LangVersion> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> </Project>
■ 結論2
こんな感じでしょうか。
.NET Framework は見捨てる場合。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>net6.0</TargetFrameworks> <LangVersion>12.0</LangVersion> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> </Project>
■ ポイント
<LangVersion>12.0</LangVersion>
で、C# の言語バージョンを指定している点です。これを指定することで、ターゲットフレームワークを過去の古いものを指定しても今の C# でコードをかけます。
この設定は、Visual Studio の UI からできるのかよくわからないので、.csproj ファイルを直接編集しています。というか、ターゲットフレームワークも直接編集しています。
言語バージョンをし愛知しない場合
こんな感じのエラーになります。つらい......
CS8936 機能 'コレクション式' は C# 10.0 では使用できません。言語バージョン 12.0 以上を使用してください。
■ ターゲットフレームワークは変えないといけないの?
ターゲットフレームワークを古い過去のものにしておかないと、使ってもらいにくくなります。
過去に生まれた古いプロダクトは過去の古いフレームワークが指定されていることでしょう。例えばライブラリを .NET8、プロダクトが .NET6 の場合は次のようにエラーになります。
エラー (アクティブ) プロジェクト '..\ClassLibrary2\ClassLibrary2.csproj' は 'net8.0' を対象にしています。'.NETCoreApp,Version=v6.0' を対象とするプロジェクトからは参照できません。
■ TargetFrameworks って何? TargetFramework じゃないの?
TargetFrameworks
にしておくと、複数指定が可能になります。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net8.0;net6.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> </Project>
こんな感じに。TargetFramework
だとエラーになります。
エラー (アクティブ) NETSDK1046 TargetFramework 値 'net9.0;net8.0' が無効です。複数をターゲットとするには、代わりに 'TargetFrameworks' プロパティを使用してください。
■ ターゲットフレームワークは何を指定しよう
サポートされている .NET は対象にしたほうが良いと思います。
dotnet.microsoft.com
2024/05 現在 .NET6 がサポート対象なので、.NET6 がいいと思います。
もう一つ、.NET Framework で使ってもらいたい場合もあると思います。
正直、言っていてそういう場合はもっと古い .NET Framework なのではという気もしますが、.NET Standard 2.0 でしょう。最新は .NET Stadard 2.1 ですが、.NET Framework が対応していないようです。
learn.microsoft.com
■ 余談
ターゲットフレームワークを変更した場合は、ソリューションを閉じて開きなおしたほうがよさそうです。合っているのにエラーになって解消できなくなったりしました。