Condividi tramite


Verificare i framework compatibili

I pacchetti contenenti framework compatibili devono assicurarsi che il codice compilato in base a uno possa essere eseguito su un altro. Esempi di coppie di framework compatibili sono:

  • .NET Standard 2.0 e .NET 7
  • .NET 6 e .NET 7

In entrambi questi casi, i consumatori possono sviluppare con .NET Standard 2.0 o .NET 6 ed eseguire in .NET 7. Se i file binari non sono compatibili tra questi framework, i consumer potrebbero finire con errori in fase di compilazione o di runtime.

La convalida del pacchetto rileva questi errori al momento del pacchetto. Ecco uno scenario di esempio:

Si supponga di scrivere un gioco che modifica le stringhe. È necessario supportare sia i consumer .NET Framework sia quelli .NET Core. Originariamente, il progetto ha come destinazione .NET Standard 2.0, ma ora si vuole sfruttare Span<T> in .NET 6 per evitare allocazioni di stringhe non necessarie. A tale scopo, si desidera configurare la multi-destinazione per .NET Standard 2.0 e .NET 6.

Il codice seguente è stato scritto:

#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

Si tenta quindi di comprimere il progetto (usando dotnet pack o Visual Studio) e il processo fallisce con il seguente errore:

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

Ci si rende conto che invece di escludere DoStringManipulation(string) per .NET 6, è sufficiente fornire un metodo aggiuntivo DoStringManipulation(ReadOnlySpan<char>) per .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.
    }

Si tenta di comprimere di nuovo il progetto e l'operazione ha esito positivo.

CompatibleFrameworksSuccessful

Modalità strict

È possibile abilitare la modalità strict per questo validator impostando la EnableStrictModeForCompatibleFrameworksInPackage proprietà nel file di progetto. L'abilitazione della modalità strict modifica alcune regole ed esegue alcune altre regole quando si ottengono le differenze. Ciò è utile quando si desidera che entrambi i lati a confronto siano strettamente identici per area di superficie e identità. Per ulteriori informazioni, vedere Modalità rigida.