Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Möglicherweise haben Sie unterschiedliche Implementierungsassemblys für verschiedene Laufzeiten in Ihrem NuGet-Paket. In diesem Fall müssen Sie sicherstellen, dass diese Assemblys miteinander und mit den Kompilierungszeitassemblys kompatibel sind.
Ein Beispiel: Sie arbeiten an einer Bibliothek mit einigen Interop-Aufrufen von Unix- bzw. Windows-APIs. 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 Kompilierungszeit verwendet, unabhängig vom zugrunde liegenden Betriebssystem.
lib\net6.0\A.dll
wird auch zur Laufzeit für Nicht-UNIX-Systeme verwendet. Jedoch wird runtimes\unix\lib\net6.0\A.dll
zur Laufzeit für Unix-Systeme verwendet.
Wenn Sie versuchen, dieses Projekt zu packen, wird die folgende Fehlermeldung angezeigt:
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)
ebenfalls der Unix-Laufzeit 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 strikten Modus für diesen Validator aktivieren, indem Sie die EnableStrictModeForCompatibleTfms
Eigenschaft in Der Projektdatei festlegen. Das Aktivieren des strengen Modus ändert einige Regeln, und einige andere Regeln werden ausgeführt, wenn die Unterschiede angezeigt werden. Dies ist nützlich, wenn Sie möchten, dass beide Seiten, die Sie vergleichen, im Oberflächenbereich und in ihrer Identität streng gleich sind. Weitere Informationen finden Sie im Strict-Modus.