Delen via


Compatibele frameworks valideren

Pakketten met compatibele frameworks moeten ervoor zorgen dat code die is gecompileerd voor een framework, ook op een ander framework kan worden uitgevoerd. Voorbeelden van compatibele frameworkparen zijn:

  • .NET Standard 2.0 en .NET 7
  • .NET 6 en .NET 7

In beide gevallen kunnen consumenten bouwen op .NET Standard 2.0 of .NET 6 en uitvoeren op .NET 7. Als uw binaire bestanden niet compatibel zijn tussen deze frameworks, kunnen consumenten compilatie- of runtime-fouten krijgen.

Bij pakketvalidatie worden deze fouten tijdens het packen van pakketten onderschept. Hier volgt een voorbeeldscenario:

Stel dat je een spel schrijft waarmee je tekenreeksen manipuleert. U moet zowel .NET Framework- als .NET (inclusief .NET Core) consumenten ondersteunen. Oorspronkelijk is uw project gericht op .NET Standard 2.0, maar nu wilt u profiteren van Span<T> .NET 6 om onnodige tekenreekstoewijzingen te voorkomen. Hiervoor wilt u meerdere doelen instellen voor .NET Standard 2.0 en .NET 6.

U hebt de volgende code geschreven:

#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

Vervolgens probeert u het project in te pakken (met behulp van dotnet pack of Visual Studio), maar er treedt een fout op en het mislukt met de volgende foutmelding:

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

U realiseert zich dat in plaats van DoStringManipulation(string) uit te sluiten voor .NET 6, u gewoon een extra DoStringManipulation(ReadOnlySpan<char>) methode moet bieden voor .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.
    }

U probeert het project opnieuw in te pakken en het lukt.

CompatibleFrameworksSuccessful

Strikte modus

U kunt de strikte modus voor deze validator inschakelen door de EnableStrictModeForCompatibleFrameworksInPackage eigenschap in uw projectbestand in te stellen. Als u de strikte modus inschakelt, worden bepaalde regels gewijzigd en worden enkele andere regels uitgevoerd bij het verkrijgen van de verschillen. Dit is handig als u wilt dat beide zijden die u vergelijkt strikt hetzelfde zijn op hun oppervlakte en identiteit. Zie de modus Strikt voor meer informatie.