Valider les frameworks compatibles
Les packages contenant des frameworks compatibles doivent garantir que le code compilé sur un framework peut s’exécuter sur un autre. Voici des exemples de paires de frameworks compatibles :
- .NET Standard 2.0 et .NET 7
- .NET 6 et .NET 7
Dans ces deux cas, les consommateurs peuvent générer sur .NET Standard 2.0 ou .NET 6, et exécuter sur .NET 7. Si vos fichiers binaires ne sont pas compatibles entre ces frameworks, les consommateurs peuvent rencontrer des erreurs lors de la compilation ou de l’exécution.
La validation de package détecte ces erreurs au moment de l’empaquetage. Voici un exemple de scénario :
Supposons que vous écrivez un jeu qui manipule des chaînes. Vous devez prendre en charge les consommateurs .NET Framework et .NET (.NET Core). À l’origine, votre projet ciblait .NET Standard 2.0, mais vous voulez maintenant tirer parti de Span<T>
dans .NET 6 pour éviter les allocations de chaînes non nécessaires. Pour cela, vous voulez cibler à la fois pour .NET Standard 2.0 et .NET 6.
Vous avez écrit le code suivant :
#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
Vous essayez ensuite d’empaqueter le projet (en utilisant dotnet pack
ou Visual Studio), et cela échoue avec l’erreur suivante :
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]
Vous vous rendez compte qu’au lieu d’exclure DoStringManipulation(string)
pour .NET 6, vous devez simplement fournir une méthode DoStringManipulation(ReadOnlySpan<char>)
supplémentaire pour .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.
}
Vous réessayez d’empaqueter le projet et cela réussit.
Mode strict
Vous pouvez activer le mode strict pour ce validateur en définissant la EnableStrictModeForCompatibleFrameworksInPackage
propriété dans votre fichier projet. L’activation du mode strict change certaines règles et exécute d’autres règles lors de l’obtention des différences. Ceci est pratique quand vous voulez que les deux côtés que vous comparez soient strictement identiques sur leur surface d’exposition et leur identité. Pour plus d’informations, consultez Mode strict.