Partager via


Valider les frameworks compatibles

Les packages contenant des frameworks compatibles doivent s’assurer que le code compilé sur un autre peut s’exécuter sur un autre. Voici quelques exemples de paires d’infrastructure 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 s’exécuter sur .NET 7. Si vos fichiers binaires ne sont pas compatibles entre ces frameworks, les consommateurs peuvent se retrouver avec des erreurs de compilation ou d’exécution.

La validation du package intercepte ces erreurs au moment du pack. Voici un exemple de scénario :

Supposons que vous écrivez un jeu qui manipule des chaînes. Vous devez prendre en charge les utilisateurs de .NET Framework et .NET (.NET Core). À l’origine, votre projet cible .NET Standard 2.0, mais vous souhaitez maintenant tirer parti de Span<T> .NET 6 pour éviter les allocations de chaînes inutiles. Pour ce faire, vous souhaitez cibler plusieurs cibles 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'emballer le projet (à l’aide de dotnet pack ou de 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]

CompatibleFrameworks

Vous réalisez qu'au lieu d'exclure DoStringManipulation(string) pour .NET 6, vous devez simplement fournir une méthode supplémentaire DoStringManipulation(ReadOnlySpan<char>) 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 essayez d'emballer le projet à nouveau, et cela réussit.

CompatibleFrameworksSuccessful

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 modifie certaines règles et exécute d’autres règles lors de l’obtention des différences. Cela est utile lorsque vous souhaitez que les deux côtés que vous comparez soient strictement identiques sur leur surface et leur identité. Pour plus d’informations, consultez mode Strict.