Bagikan melalui


Memvalidasi kerangka kerja yang kompatibel

Paket yang berisi kerangka kerja yang kompatibel perlu memastikan bahwa kode yang dikompilasi terhadap satu dapat berjalan terhadap yang lain. Contoh pasangan kerangka kerja yang kompatibel adalah:

  • .NET Standard 2.0 dan .NET 7
  • .NET 6 dan .NET 7

Dalam kedua kasus ini, konsumen dapat membangun terhadap .NET Standard 2.0 atau .NET 6 dan berjalan pada .NET 7. Jika biner Anda tidak kompatibel antara kerangka kerja ini, konsumen dapat berakhir dengan kesalahan waktu kompilasi atau run-time.

Validasi paket menangkap kesalahan ini pada waktu paket. Berikut adalah contoh skenario:

Misalkan Anda menulis game yang memanipulasi string. Anda perlu mendukung konsumen .NET Framework dan .NET (.NET Core). Awalnya, proyek Anda menargetkan .NET Standard 2.0, tetapi sekarang Anda ingin memanfaatkan Span<T> di .NET 6 untuk menghindari alokasi string yang tidak perlu. Untuk melakukannya, Anda ingin multi-target untuk .NET Standard 2.0 dan .NET 6.

Anda telah menulis kode berikut:

#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

Anda kemudian mencoba mengemas proyek (menggunakan dotnet pack atau Visual Studio), dan gagal dengan kesalahan berikut:

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

Anda menyadari bahwa alih-alih mengecualikan DoStringManipulation(string) untuk .NET 6, Anda hanya perlu memberikan metode tambahan DoStringManipulation(ReadOnlySpan<char>) untuk .NET 6:

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

Anda mencoba mengemas proyek lagi, dan berhasil.

CompatibleFrameworksSuccessful

Mode ketat

Anda dapat mengaktifkan mode ketat untuk validator ini dengan mengatur EnableStrictModeForCompatibleFrameworksInPackage properti dalam file proyek Anda. Mengaktifkan mode ketat mengubah beberapa aturan dan menjalankan beberapa aturan lain saat mendapatkan perbedaan. Ini berguna ketika Anda ingin kedua belah pihak Anda membandingkan dengan benar-benar sama pada area permukaan dan identitas mereka. Untuk informasi selengkapnya, lihat Mode ketat.