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]
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.
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.