Partilhar via


Validar pacotes em tempos de execução diferentes

Você pode optar por ter assemblies de implementação diferentes para tempos de execução diferentes em seu pacote NuGet. Se for esse o caso, assegure-se de que esses conjuntos/complementos são compatíveis entre si e com os conjuntos/componentes de tempo de compilação.

Por exemplo, considere o seguinte cenário. Você está trabalhando em uma biblioteca envolvendo algumas chamadas de interoperabilidade para APIs Unix e 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 do 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 tempo de execução para sistemas não-Unix. No entanto, runtimes\unix\lib\net6.0\A.dll é usado em tempo de execução para sistemas Unix.

Quando você tenta empacotar este projeto, você obtém 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ê percebe seu erro e adiciona A.B.Open(string) ao tempo de execução do Unix também.

#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 tem sucesso.

MúltiplasExecuçõesBemSucedidas

Modo estrito

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