Validación de paquetes en distintos entornos de ejecución

Puede optar por tener ensamblados de implementación diferentes para distintos entornos de ejecución en el paquete NuGet. En ese caso, debe asegurarse de que estos ensamblados son compatibles entre sí y con los ensamblados en tiempo de compilación.

Por ejemplo, tenga en cuenta el siguiente caso. Está trabajando en una biblioteca que implica algunas llamadas de interoperabilidad a Unix y a las API de Windows, respectivamente. Ha escrito el código siguiente:

#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

La estructura del paquete resultante tiene el aspecto siguiente.

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

lib\net6.0\A.dll siempre se usa en tiempo de compilación, independientemente del sistema operativo subyacente. lib\net6.0\A.dll también se usa en tiempo de ejecución para sistemas que no sean Unix. Aun así, runtimes\unix\lib\net6.0\A.dll se usa en tiempo de ejecución para sistemas Unix.

Al intentar empaquetar este proyecto, se producirá el error siguiente:

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

Se da cuenta de su error y también agrega A.B.Open(string) al entorno de ejecución de 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

Intenta empaquetar el proyecto de nuevo y se realiza correctamente.

MultipleRuntimesSuccessful

Modo strict

Puede habilitar el modo strict para este validador al configurar laEnableStrictModeForCompatibleTfms propiedad en el archivo del proyecto. La habilitación del modo strict cambia algunas reglas y otras se ejecutarán al obtener las diferencias. Esto resulta útil cuando se quiere que los lados que se comparan tengan un área de superficie e identidad estrictamente iguales. Para obtener más información, consulte Modo strict.