.NET 6.0
で作成していたライブラリを.NET Standard 2.0
に対応する必要があるときの覚書
プロジェクトファイルの設定
-
*.csproj
を開き、TargetFramework
をTargetFrameworks
に変更し、;
で区切ってnetstandard2.0
を追加する -
LangVersion
タグを追加し、値を9.0
とする
変更前
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
~省略~
</PropertyGroup>
</Project>
変更後
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net6.0;netstandard2.0</TargetFrameworks>
<LangVersion>9.0</LangVersion>
~省略~
</PropertyGroup>
</Project>
init
の有効化
-
IsExternalInit
クラスを追加する
IsExternalInit.cs
using System.ComponentModel;
namespace System.Runtime.CompilerServices
{
/// <summary>
/// Reserved to be used by the compiler for tracking metadata.
/// This class should not be used by developers in source code.
/// This dummy class is required to compile records when targeting .NET Standard
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
internal static class IsExternalInit
{
}
}
メソッドが対応していない場合
コンパイルエラーが出る場合は下記を試してみる
NuGet
で探す
- 利用していた属性が見つからない場合等、
NuGet
パッケージの管理で探してみる- 例:
System.ComponentModel.DataAnnotations.Schema.ColumnAttribute
属性が見つからない
→ アセンブリ名System.ComponentModel.Annotations
で検索
- 例:
書き方を変更する
-
if
ディレクティブで対応している書き方に変える- 例:
Enum.GetValues
メソッドがジェネリック版に対応していない
- 例:
変更前
public void Sample()
{
foreach (var value in Enum.GetValues<TypeCode>())
{
// 処理
}
}
変更後
public void Sample()
{
#if NETSTANDARD2_0
foreach (TypeCode value in Enum.GetValues(typeof(TypeCode)))
#else
foreach (var value in Enum.GetValues<TypeCode>())
#endif
{
// 処理
}
}