Dela via


Verifiera kompatibla ramverk

Paket som innehåller kompatibla ramverk måste se till att kod som kompileras mot en kan köras mot en annan. Exempel på kompatibla ramverkspar är:

  • .NET Standard 2.0 och .NET 7
  • .NET 6 och .NET 7

I båda dessa fall kan konsumenter skapa mot .NET Standard 2.0 eller .NET 6 och köra på .NET 7. Om binärfilerna inte är kompatibla mellan dessa ramverk kan konsumenterna få kompileringsfel eller körningsfel.

Paketvalidering fångar upp dessa fel vid pakettid. Här är ett exempelscenario:

Anta att du skriver ett spel som manipulerar strängar. Du måste ha stöd för både .NET Framework- och .NET-konsumenter (.NET Core). Ursprungligen riktade projektet in sig på .NET Standard 2.0, men nu vill du dra nytta av Span<T> i .NET 6 för att undvika onödiga strängallokeringar. För att göra det vill du ha flera mål för .NET Standard 2.0 och .NET 6.

Du har skrivit följande kod:

#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

Sedan försöker du packa projektet (med antingen dotnet pack eller Visual Studio), och det misslyckas med följande fel:

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

Du inser att i stället för att undanta DoStringManipulation(string) för .NET 6 bör du bara ange en ytterligare DoStringManipulation(ReadOnlySpan<char>) metod för .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.
    }

Du försöker packa projektet igen och det lyckas.

CompatibleFrameworksSuccessful

Strikt läge

Du kan aktivera strikt läge för den här valideraren genom att ange EnableStrictModeForCompatibleFrameworksInPackage egenskapen i projektfilen. När du aktiverar strikt läge ändras vissa regler och vissa andra regler körs när skillnaderna hämtas. Detta är användbart när du vill att båda sidor ska jämföras med exakt samma på deras yta och identitet. Mer information finns i Strikt läge.