rksoftware

Visual Studio とか C# とかが好きです

.NET のライブラリ作成時のターゲットフレームワークについて

■ 結論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

■ 余談

ターゲットフレームワークを変更した場合は、ソリューションを閉じて開きなおしたほうがよさそうです。合っているのにエラーになって解消できなくなったりしました。