次の方法で共有


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

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

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

プロジェクトをもう一度パックしようとすると、成功します。

対応フレームワーク成功

厳格モード

プロジェクト ファイルで EnableStrictModeForCompatibleFrameworksInPackageを設定することで、このバリデーターの厳格モードを有効にすることができます。 厳密モードを有効にすると、一部のルールが変更され、違いを取得するときに他のルールがいくつか実行されます。 これは、比較する両側が、そのサーフェス領域と ID で厳密に同じである必要がある場合に便利です。 詳細については、「 厳密モード」を参照してください。