Поделиться через


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

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

Вы пробуете снова упаковать проект, и оно удается.

MultipleRuntimesSuccessful

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

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