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