Проверка пакетов для разных сред выполнения
Вы можете настроить разные сборки реализации для разных сред выполнения в пакете 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
свойство в файле проекта. При включении строгого режима будут изменены некоторые правила, а другие правила будут выполняться при получении различий. Это полезно, если нужно, чтобы обе стороны сравнения были строго одинаковыми по контактной зоне и идентификатору. Дополнительные сведения см. в разделе "Строгий режим".