Partager via


Valider des packages par rapport à différents runtimes

Vous pouvez choisir d’avoir différents assemblys d’implémentation pour différents runtimes dans votre package NuGet. Dans ce cas, vous devez vous assurer de la compatibilité de ces assemblys entre eux et avec les assemblys de compilation.

Par exemple, considérez le scénario suivant. Vous travaillez sur une bibliothèque impliquant des appels d’interopérabilité aux API Unix et Windows, respectivement. Vous avez écrit le code suivant :

#if Unix
    public static void Open(string path, bool securityDescriptor)
    {
        // Call Unix specific stuff.
    }
#else
    public static void Open(string path)
    {
        // Call Windows specific stuff.
    }
#endif

La structure de package résultante se présente comme suit.

lib/net6.0/A.dll
runtimes/unix/lib/net6.0/A.dll

lib\net6.0\A.dll est toujours utilisé au moment de la compilation, quel que soit le système d’exploitation sous-jacent. lib\net6.0\A.dll est également utilisé au moment de l’exécution pour les systèmes non Unix. Toutefois, runtimes\unix\lib\net6.0\A.dll est utilisé au moment de l’exécution pour les systèmes Unix.

Lorsque vous essayez d’empaqueter ce projet, vous obtenez le message d’erreur suivant :

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
  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.Open(string)' exists on lib/net6.0/PackageValidationThrough.dll but not on runtimes/unix/lib/net6.0/PackageValidationThrough.dll [D:\demo\PackageValidationThrough.csproj]
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.Open(string, bool)' exists on runtimes/unix/lib/net6.0/PackageValidationThrough.dll but not on lib/net6.0/PackageValidationThrough.dll [D:\demo\PackageValidationThrough.csproj]

MultipleRuntimes

Vous vous rendez compte de votre erreur et vous ajoutez également A.B.Open(string) au runtime Unix.

#if Unix
    public static void Open(string path, bool securityDescriptor)
    {
        // Call Unix specific stuff.
    }

    public static void Open(string path)
    {
        throw new PlatformNotSupportedException();
    }
#else
    public static void Open(string path)
    {
        // Call Windows specific stuff.
    }

    public static void Open(string path, bool securityDescriptor)
    {
        throw new PlatformNotSupportedException();
    }
#endif

Vous réessayez d’empaqueter le projet et cela réussit.

MultipleRuntimesSuccessful

Mode strict

Vous pouvez activer le mode strict pour ce validateur en définissant la EnableStrictModeForCompatibleTfms propriété dans votre fichier projet. L’activation du mode strict change certaines règles, et d’autres règles seront exécutées 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.