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]
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.
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.