Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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]
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.
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.