Share via


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]

CompatibleFrameworks

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.

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