Validación de marcos compatibles

Los paquetes que contienen marcos compatibles deben asegurarse de que el código compilado en uno se pueda ejecutar en otro. Estos son algunos ejemplos de pares de marco compatibles:

  • .NET Standard 2.0 y .NET 7
  • .NET 6 y .NET 7

En ambos casos, los consumidores pueden compilarse en .NET Standard 2.0 o .NET 6 y ejecutarse en .NET 7. Si los archivos binarios no son compatibles entre estos marcos, los consumidores podrían acabar con errores en tiempo de compilación o errores en tiempo de ejecución.

La validación de paquetes detecta estos errores en el momento del empaquetado. He aquí un escenario de ejemplo:

Supongamos que está escribiendo un juego que manipula cadenas. Debe admitir tanto a los consumidores de .NET Framework como a los .NET (.NET Core). Originalmente, el proyecto tiene como destino .NET Standard 2.0, pero ahora quiere aprovechar las ventajas de Span<T> en .NET 6 para evitar asignaciones de cadenas innecesarias. Para ello, quiere tener varios destinos para .NET Standard 2.0 y .NET 6.

Ha escrito el código siguiente:

#if NET6_0_OR_GREATER
    public void DoStringManipulation(ReadOnlySpan<char> input)
    {
        // use spans to do string operations.
    }
#else
    public void DoStringManipulation(string input)
    {
        // Do some string operations.
    }
#endif

Después, intenta empaquetar el proyecto (mediante dotnet pack o Visual Studio) y se produce 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
  You are using a preview version of .NET. See: https://aka.ms/dotnet-core-preview
  PackageValidationThrough -> D:\demo\bin\Debug\netstandard2.0\PackageValidationThrough.dll
  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.DoStringManipulation(string)' exists on lib/netstandard2.0/PackageValidationThrough.dll but not on lib/net6.0/PackageValidationThrough.dll [D:\demo\PackageValidationThrough.csproj]

CompatibleFrameworks

Se da cuenta de que, en lugar de excluir DoStringManipulation(string) para .NET 6, solo debe proporcionar un método adicional DoStringManipulation(ReadOnlySpan<char>) para .NET 6:

#if NET6_0_OR_GREATER
    public void DoStringManipulation(ReadOnlySpan<char> input)
    {
        // use spans to do string operations.
    }
#endif
    public void DoStringManipulation(string input)
    {
        // Do some string operations.
    }

Intenta empaquetar el proyecto de nuevo y se realiza correctamente.

CompatibleFrameworksSuccessful

Modo strict

Puede habilitar el modo strict para este validador al configurar laEnableStrictModeForCompatibleFrameworksInPackage propiedad en el archivo del proyecto. Al habilitar el modo strict, se cambian algunas reglas y se ejecutan otras 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.