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