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. Nesse caso, você precisa certificar-se de que esses assemblies são compatíveis entre si e com os assemblies em 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 ele consegue.

MultipleRuntimesSuccessful

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.