Uyumlu çerçeveleri doğrulama

Uyumlu çerçeveler içeren paketlerin, birine karşı derlenmiş kodun diğerine karşı çalıştırılabilmesini sağlaması gerekir. Uyumlu çerçeve çiftlerine örnek olarak şunlar verilebilir:

  • .NET Standard 2.0 ve .NET 7
  • .NET 6 ve .NET 7

Her iki durumda da tüketiciler .NET Standard 2.0 veya .NET 6'ya göre derleyebilir ve .NET 7 üzerinde çalışabilir. İkili dosyalarınız bu çerçeveler arasında uyumlu değilse, tüketiciler derleme zamanı veya çalışma zamanı hataları ile sonuçlanabilir.

Paket doğrulaması bu hataları paket zamanında yakalar. Örnek bir senaryo aşağıda verilmişti:

Dizeleri işleyen bir oyun yazdığınızı varsayalım. Hem .NET Framework hem de .NET (.NET Core) tüketicilerini desteklemeniz gerekir. Başlangıçta, projeniz .NET Standard 2.0'ı hedefledi, ancak şimdi gereksiz dize ayırmalarını önlemek için .NET 6'da avantajlarından yararlanmak Span<T> istiyorsunuz. Bunu yapmak için .NET Standard 2.0 ve .NET 6 için birden çok hedef kullanmak istiyorsunuz.

Aşağıdaki kodu yazdınız:

#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

Ardından projeyi paketlemeye çalışırsınız (veya Visual Studio kullanarak dotnet pack ) ve aşağıdaki hatayla başarısız olur:

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'yı dışlamak DoStringManipulation(string) yerine .NET 6 için ek DoStringManipulation(ReadOnlySpan<char>) bir yöntem sağlamanız gerektiğini fark ediyorsunuz:

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

Projeyi yeniden paketlemeye çalışırsınız ve başarılı olur.

CompatibleFrameworksSuccessful

Katı mod

Proje dosyanızda özelliğini ayarlayarakEnableStrictModeForCompatibleFrameworksInPackagebu doğrulayıcı için katı modu etkinleştirebilirsiniz. Katı modun etkinleştirilmesi bazı kuralları değiştirir ve farkları alırken başka kurallar yürütür. Bu, karşılaştırdığınız her iki tarafın da yüzey alanında ve kimliklerinde tamamen aynı olmasını istediğinizde kullanışlıdır. Daha fazla bilgi için bkz . Katı mod.