Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
V balíčku NuGet můžete mít různá implementační sestavení pro různé runtimy. V takovém případě je nutné zajistit, aby byla tato sestavení vzájemně kompatibilní a s sestaveními v době kompilace.
Představte si například následující scénář. Pracujete na knihovně, která zahrnuje interop volání do rozhraní API Unixu a Windows. Napsali jste následující kód:
#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
Výsledná struktura balíčku vypadá následovně.
lib/net6.0/A.dll
runtimes/unix/lib/net6.0/A.dll
lib\net6.0\A.dll se vždy používá v době kompilace bez ohledu na základní operační systém.
lib\net6.0\A.dll používá se také za běhu pro systémy, které nejsou systémy Unix.
runtimes\unix\lib\net6.0\A.dll Používá se však za běhu pro systémy Unix.
Při pokusu o zabalení tohoto projektu se zobrazí následující chyba:
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]
Uvědomíte si svou chybu a přidáte A.B.Open(string) také do Unix runtime.
#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
Zkusíte projekt znovu zabalit a to se podaří.
Striktní režim
Pro tento validátor můžete povolit striktní režim nastavením EnableStrictModeForCompatibleTfms vlastnosti v souboru projektu. Povolení přísného režimu změní některá pravidla a některá další pravidla se spustí, když se shromažďují rozdíly. To je užitečné, když chcete, aby obě strany, které porovnáváte, byly striktně stejné co do povrchové plochy i identity. Další informace naleznete v tématu Striktní režim.