Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Możesz wybrać różne zestawy implementacji dla różnych środowisk uruchomieniowych w pakiecie NuGet. W takim przypadku należy upewnić się, że te zestawy są ze sobą zgodne oraz zgodne z zestawami używanymi podczas kompilacji.
Rozważmy na przykład następujący scenariusz. Pracujesz nad biblioteką obejmującą odpowiednio niektóre wywołania międzyoperacyjne do interfejsów API systemów Unix i Windows. Napisałeś następujący kod:
#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
Wynikowa struktura pakietu wygląda następująco.
lib/net6.0/A.dll
runtimes/unix/lib/net6.0/A.dll
lib\net6.0\A.dll jest zawsze używany w czasie kompilacji, niezależnie od bazowego systemu operacyjnego.
lib\net6.0\A.dll jest również używany w czasie wykonywania w systemach innych niż Unix. Jednak runtimes\unix\lib\net6.0\A.dll jest używany w środowisku wykonawczym dla systemów Unix.
Podczas próby spakowania tego projektu występuje następujący błąd:
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]
Uświadamiasz sobie swój błąd i dodajesz A.B.Open(string) również do środowiska Uniksa.
#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
Spróbujesz ponownie spakować projekt i tym razem się uda.
Tryb ścisły
Możesz włączyć tryb ścisły dla tego walidatora, ustawiając EnableStrictModeForCompatibleTfms właściwość w pliku projektu. Włączenie trybu ścisłego zmienia niektóre reguły, a inne zostaną zastosowane w momencie uzyskiwania różnic. Jest to przydatne, gdy chcesz, aby obie strony były dokładnie takie same pod względem powierzchni i tożsamości. Aby uzyskać więcej informacji, zobacz Tryb ścisły.