互換性のあるフレームワークを含むパッケージでは、あるフレームワークに対してコンパイルされたコードを別のフレームワークに対して実行できるようにする必要があります。 互換性のあるフレームワーク ペアの例を次に示します。
- .NET Standard 2.0 および .NET 7
- .NET 6 と .NET 7
どちらの場合も、コンシューマーは .NET Standard 2.0 または .NET 6 に対してビルドし、.NET 7 で実行できます。 バイナリがこれらのフレームワーク間で互換性がない場合、コンシューマーはコンパイル時または実行時エラーになる可能性があります。
パッケージの検証では、パック時にこれらのエラーがキャッチされます。 シナリオの例を次に示します。
文字列を操作するゲームを作成しているとします。 .NET Framework と .NET (.NET Core) の両方のコンシューマーをサポートする必要があります。 当初、プロジェクトは .NET Standard 2.0 を対象としましたが、.NET 6 の Span<T>
を利用して、不要な文字列の割り当てを回避したいと考えています。 これを行うには、.NET Standard 2.0 と .NET 6 をマルチターゲットにする必要があります。
次のコードを記述しました。
#if NET6_0_OR_GREATER
public void DoStringManipulation(ReadOnlySpan<char> input)
{
// use spans to do string operations.
}
#else
public void DoStringManipulation(string input)
{
// Do some string operations.
}
#endif
その後、( dotnet pack
または Visual Studio を使用して) プロジェクトをパックしようとすると、次のエラーで失敗します。
D:\demo>dotnet pack
Microsoft (R) Build Engine version 17.0.0-preview-21460-01+8f208e609 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.
Determining projects to restore...
All projects are up-to-date for restore.
You are using a preview version of .NET. See: https://aka.ms/dotnet-core-preview
You are using a preview version of .NET. See: https://aka.ms/dotnet-core-preview
PackageValidationThrough -> D:\demo\bin\Debug\netstandard2.0\PackageValidationThrough.dll
PackageValidationThrough -> D:\demo\bin\Debug\net6.0\PackageValidationThrough.dll
Successfully created package 'D:\demo\bin\Debug\PackageValidationThrough.1.0.0.nupkg'.
C:\Program Files\dotnet\sdk\6.0.100-rc.1.21463.6\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Compatibility.Common.targets(32,5): error CP0002: Member 'A.B.DoStringManipulation(string)' exists on lib/netstandard2.0/PackageValidationThrough.dll but not on lib/net6.0/PackageValidationThrough.dll [D:\demo\PackageValidationThrough.csproj]
.NET 6 の DoStringManipulation(string)
を除外する代わりに、.NET 6 用の追加の DoStringManipulation(ReadOnlySpan<char>)
メソッドを提供する必要があることに気付きます。
#if NET6_0_OR_GREATER
public void DoStringManipulation(ReadOnlySpan<char> input)
{
// use spans to do string operations.
}
#endif
public void DoStringManipulation(string input)
{
// Do some string operations.
}
プロジェクトをもう一度パックしようとすると、成功します。
厳格モード
プロジェクト ファイルで EnableStrictModeForCompatibleFrameworksInPackage
を設定することで、このバリデーターの厳格モードを有効にすることができます。 厳密モードを有効にすると、一部のルールが変更され、違いを取得するときに他のルールがいくつか実行されます。 これは、比較する両側が、そのサーフェス領域と ID で厳密に同じである必要がある場合に便利です。 詳細については、「 厳密モード」を参照してください。
.NET