Überprüfen von Paketen für verschiedene Runtimes

Sie können verschiedene Implementierungsassemblys für verschiedene Runtimes in Ihrem NuGet-Paket verwenden. In diesem Fall müssen Sie sicherstellen, dass diese Assemblys miteinander und mit den Kompilierzeitassemblys kompatibel sind.

Ein Beispiel: Sie arbeiten an einer Bibliothek, die einige Interop-Aufrufe an UNIX bzw. Windows-APIs enthält. Sie haben den folgenden Code geschrieben:

#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

Die resultierende Paketstruktur sieht wie folgt aus.

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

lib\net6.0\A.dll wird immer zur Kompilierzeit verwendet, unabhängig vom zugrunde liegenden Betriebssystem. lib\net6.0\A.dll wird auch zur Laufzeit für Nicht-UNIX-Systeme verwendet. runtimes\unix\lib\net6.0\A.dll wird jedoch zur Laufzeit für UNIX-Systeme verwendet.

Wenn Sie versuchen, dieses Projekt zu packen, erhalten Sie den folgenden Fehler:

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

Sie erkennen Ihren Fehler und fügen A.B.Open(string) auch der UNIX-Runtime hinzu.

#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

Sie versuchen, das Projekt erneut zu packen, und der Vorgang ist erfolgreich.

MultipleRuntimesSuccessful

Strict-Modus

Sie können den Strict-Modus für dieses Validierungssteuerelement aktivieren, indem Sie die EnableStrictModeForCompatibleTfms-Eigenschaft in Ihrer Projektdatei festlegen. Durch das Aktivieren des Strict-Modus werden einige Regeln geändert und einige andere Regeln ausgeführt, wenn die Unterschiede erkannt werden. Dies ist nützlich, wenn Sie möchten, dass beide Seiten, die Sie vergleichen, hinsichtlich ihrer Oberfläche und Identität identisch sind. Weitere Informationen finden Sie unter Strict-Modus.