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 que ces assemblages sont compatibles entre eux et avec les assemblages au moment de la compilation.

Par exemple, considérez le scénario suivant. Vous travaillez sur une bibliothèque impliquant des appels d’interopérabilité à des 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é lors 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 de packer ce projet, vous obtenez 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
  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 réalisez votre erreur et vous ajoutez A.B.Open(string) au runtime Unix également.

#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 essayez d'emballer le projet à nouveau, 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 modifie certaines règles et d’autres règles sont exécutées 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.