Проверка пакетов для разных сред выполнения

Вы можете настроить разные сборки реализации для разных сред выполнения в пакете 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]

MultipleRuntimes

Вы понимаете свою ошибку и добавляете 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

Вы снова пытаетесь упаковать проект, на этот раз успешно.

MultipleRuntimesSuccessful

Строгий режим

Вы можете включить строгий режим для этого проверяющего элемента, задав EnableStrictModeForCompatibleTfms свойство в файле проекта. При включении строгого режима будут изменены некоторые правила, а другие правила будут выполняться при получении различий. Это полезно, если нужно, чтобы обе стороны сравнения были строго одинаковыми по контактной зоне и идентификатору. Дополнительные сведения см. в разделе "Строгий режим".