互換性のあるフレームワークを検証する

互換性のある複数のフレームワークを含むパッケージの場合、ある 1 つを対象にコンパイルされたコードを、別のものを対象にして確実に実行できる必要があります。 互換性のあるフレームワークのペアの例を次に示します。

  • .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]

CompatibleFrameworks

.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.
    }

プロジェクトを再度パックすると、今度は成功します。

CompatibleFrameworksSuccessful

厳格モード

プロジェクト ファイルで EnableStrictModeForCompatibleFrameworksInPackage プロパティを設定することにより、この検証コントロールの "厳格モード" を有効にすることができます。 厳格モードを有効にすると、一部のルールが変更され、相違点を検出するときに他のルールが実行されます。 これは、比較している両方の側がアクセス領域と ID に関して厳密に同じになるようにする場合に便利です。 詳細については、「厳密モード」を参照してください。