Compartilhar via


Validar pacotes em runtimes diferentes

Você pode optar por ter assemblies de implementação diferentes para runtimes diferentes em seu pacote NuGet. Nesse caso, você precisa garantir que esses conjuntos sejam compatíveis entre si e com os conjuntos de tempo de compilação.

Por exemplo, considere o cenário a seguir. Você está trabalhando em uma biblioteca que envolve algumas chamadas de interoperabilidade para APIs do Unix e do Windows, respectivamente. Você escreveu o seguinte código:

#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

A estrutura de pacote resultante tem a seguinte aparência.

lib/net6.0/A.dll
runtimes/unix/lib/net6.0/A.dll

lib\net6.0\A.dll é sempre usado em tempo de compilação, independentemente do sistema operacional subjacente. lib\net6.0\A.dll também é usado em runtime para sistemas não Unix. No entanto, runtimes\unix\lib\net6.0\A.dll é usado em runtime para sistemas Unix.

Ao tentar empacotar este projeto, você receberá o seguinte erro:

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

Você também percebe o erro e adiciona A.B.Open(string) ao runtime do 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

Você tenta empacotar o projeto novamente e ele é bem-sucedido.

MultipleRuntimesSuccessful

Modo estrito

Você pode habilitar o modo estrito para esse validador definindo a EnableStrictModeForCompatibleTfms propriedade em seu arquivo de projeto. A habilitação do modo estrito altera algumas regras e algumas outras regras serão executadas ao obter as diferenças. Isso é útil quando você deseja que ambos os lados sejam estritamente iguais em sua área de superfície e identidade. Para obter mais informações, consulte o modo estrito.