Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Вы можете выбрать разные сборки реализации для разных сред выполнения в пакете NuGet. В этом случае необходимо убедиться, что эти сборки совместимы друг с другом и со сборками во время компиляции.
Например, рассмотрим следующий сценарий. Вы работаете над библиотекой, включающей некоторые вызовы взаимодействия к API Unix и Windows соответственно. Вы написали следующий код:
#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
Результирующая структура пакета выглядит следующим образом.
lib/net6.0/A.dll
runtimes/unix/lib/net6.0/A.dll
lib\net6.0\A.dll
всегда используется во время компиляции независимо от базовой операционной системы.
lib\net6.0\A.dll
также используется во время выполнения для систем, отличных от Unix. Однако runtimes\unix\lib\net6.0\A.dll
используется во время выполнения для систем Unix.
При попытке упаковать этот проект вы получите следующую ошибку:
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]
Вы также понимаете свою ошибку и добавляете A.B.Open(string)
в среду выполнения Unix.
#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
Вы пробуете снова упаковать проект, и оно удается.
Строгий режим
Вы можете включить строгий режим для этого проверяющего элемента, задав EnableStrictModeForCompatibleTfms
свойство в файле проекта. Включение строгого режима изменяет некоторые правила, а при получении различий будут выполняться некоторые другие правила. Это полезно, если вы хотите, чтобы обе сравниваемые стороны были строго одинаковыми по площади поверхности и по свойствам. Дополнительные сведения см. в разделе "Строгий режим".