Condividi tramite


Novità dell'SDK e degli strumenti per .NET 8

Questo articolo descrive le nuove funzionalità di .NET SDK e gli strumenti per .NET 8.

SDK

Questa sezione contiene i seguenti argomenti secondari:

Valutazione del progetto basata sull'interfaccia della riga di comando

MSBuild include una nuova funzionalità che semplifica l'incorpora dei dati di MSBuild in script o strumenti. I nuovi flag seguenti sono disponibili per i comandi dell'interfaccia della linea di comando, ad esempio dotnet publish, per ottenere dati da utilizzare nelle pipeline di CI e altrove.

Flag Description
--getProperty:<PROPERTYNAME> Recupera la proprietà MSBuild con il nome specificato.
--getItem:<ITEMTYPE> Recupera gli elementi MSBuild del tipo specificato.
--getTargetResult:<TARGETNAME> Recupera gli output dall'esecuzione della destinazione specificata.

I valori vengono scritti nell'output standard. Più valori complessi vengono restituiti come JSON, come illustrato negli esempi seguenti.

>dotnet publish --getProperty:OutputPath
bin\Release\net8.0\
>dotnet publish -p PublishProfile=DefaultContainer --getProperty:GeneratedContainerDigest --getProperty:GeneratedContainerConfiguration
{
  "Properties": {
    "GeneratedContainerDigest": "sha256:ef880a503bbabcb84bbb6a1aa9b41b36dc1ba08352e7cd91c0993646675174c4",
    "GeneratedContainerConfiguration": "{\u0022config\u0022:{\u0022ExposedPorts\u0022:{\u00228080/tcp\u0022:{}},\u0022Labels\u0022...}}"
  }
}
>dotnet publish -p PublishProfile=DefaultContainer --getItem:ContainerImageTags
{
  "Items": {
    "ContainerImageTags": [
      {
        "Identity": "latest",
        ...
    ]
  }
}

Output di compilazione del terminale

dotnet build ha una nuova opzione per produrre un output di compilazione più modernizzato. Questo output del Terminal Logger raggruppa errori con il progetto da cui provengono, distingue meglio i diversi framework di destinazione per progetti con più destinazioni e fornisce informazioni in tempo reale sulle attività di costruzione. Per acconsentire esplicitamente al nuovo output, usare l'opzione --tl . Per altre informazioni su questa opzione, vedere opzioni di compilazione dotnet.

Percorsi di output semplificati

.NET 8 introduce un'opzione per semplificare il percorso di output e la struttura di cartelle per gli output di compilazione. In precedenza, le app .NET generano un set completo e complesso di percorsi di output per diversi artefatti di compilazione. La nuova struttura del percorso di output semplificata raccoglie tutti gli output di compilazione in un'unica posizione, rendendo più facile per gli strumenti anticipare i risultati.

Per altre informazioni, vedere Layout di output degli artefatti.

dotnet workload clean comando

.NET 8 introduce un nuovo comando per pulire i pacchetti di carico di lavoro che potrebbero essere lasciati tramite diversi aggiornamenti di .NET SDK o Visual Studio. Se si verificano problemi durante la gestione dei carichi di lavoro, provare a usare workload clean per ripristinare in modo sicuro uno stato noto prima di riprovare. Il comando ha due modalità:

  • dotnet workload clean

    Esegue il Garbage Collection del carico di lavoro per carichi di lavoro basati su file o basati su MSI, che pulisce i pacchetti orfani. I pacchetti orfani provengono da versioni disinstallate di .NET SDK o pacchetti in cui i record di installazione per il pacchetto non esistono più.

    Se Visual Studio è installato, il comando elenca anche tutti i carichi di lavoro da pulire manualmente usando Visual Studio.

  • dotnet workload clean --all

    Questa modalità è più aggressiva e pulisce ogni pacchetto nel computer che è del tipo di installazione corrente del carico di lavoro SDK (e non da Visual Studio). Rimuove anche tutti i record di installazione del carico di lavoro per il gruppo di funzionalità .NET SDK in esecuzione e di seguito.

dotnet publish e dotnet pack assetti

Poiché i comandi dotnet publish e dotnet pack sono destinati a generare asset di produzione, ora generano asset Release per impostazione predefinita.

L'output seguente illustra il diverso comportamento tra dotnet build e dotnet publishe come ripristinare la pubblicazione Debug degli asset impostando la PublishRelease proprietà su false.

/app# dotnet new console
/app# dotnet build
  app -> /app/bin/Debug/net8.0/app.dll
/app# dotnet publish
  app -> /app/bin/Release/net8.0/app.dll
  app -> /app/bin/Release/net8.0/publish/
/app# dotnet publish -p:PublishRelease=false
  app -> /app/bin/Debug/net8.0/app.dll
  app -> /app/bin/Debug/net8.0/publish/

Per ulteriori informazioni, vedere 'dotnet pack' utilizza la configurazione Release e 'dotnet publish' utilizza la configurazione Release.

dotnet restore controllo di sicurezza

A partire da .NET 8, è possibile acconsentire esplicitamente ai controlli di sicurezza per verificare la presenza di vulnerabilità note quando vengono ripristinati i pacchetti di dipendenza. Questo controllo genera un report delle vulnerabilità di sicurezza con il nome del pacchetto interessato, la gravità della vulnerabilità e un collegamento all'avviso contenente altri dettagli. Quando si esegue dotnet add o dotnet restore, vengono visualizzati avvisi NU1901-NU1904 per eventuali vulnerabilità rilevate. Per altre informazioni, vedere Controllare le vulnerabilità di sicurezza.

Motore di template

Il motore di modelli offre un'esperienza più sicura in .NET 8 integrando alcune delle funzionalità correlate alla sicurezza di NuGet. I miglioramenti includono:

  • Impedire il download dei pacchetti dai http:// feed per impostazione predefinita. Ad esempio, il comando seguente non riuscirà a installare il pacchetto modello perché l'URL di origine non usa HTTPS.

    dotnet new install console --add-source "http://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public/nuget/v3/index.json"

    È possibile eseguire l'override di questa limitazione usando il --force flag .

  • Per dotnet new, dotnet new install e dotnet new update, verificare la presenza di vulnerabilità note nel pacchetto del modello. Se vengono rilevate vulnerabilità e si desidera procedere, è necessario usare il --force flag .

  • Per dotnet new, fornisci informazioni sul proprietario del pacchetto template. La proprietà viene verificata dal portale NuGet e può essere considerata una caratteristica attendibile.

  • Per dotnet search e dotnet uninstall, indicare se un modello è installato da un pacchetto "trusted", ovvero usa un prefisso riservato.

Il collegamento di origine è ora incluso in .NET SDK. L'obiettivo è che raggruppando il collegamento all'origine nell'SDK, invece di richiedere un pacchetto separato, altri pacchetti includeranno queste informazioni per impostazione predefinita.The goal is that by bundling Source Link into the SDK, invece di richiedere un separato <PackageReference> per il pacchetto, più pacchetti includeranno queste informazioni per impostazione predefinita. Queste informazioni miglioreranno l'esperienza dell'IDE per gli sviluppatori.

Annotazioni

Come effetto collaterale di questa modifica, le informazioni sul commit sono incluse nel InformationalVersion valore delle librerie e delle applicazioni compilate, anche quelle destinate a .NET 7 o a una versione precedente. Per ulteriori informazioni, vedere Link alla fonte incluso nel .NET SDK.

SDK di compilazione di origine

La distribuzione Linux costruita con il SDK di source-build ha ora la possibilità di costruire applicazioni indipendenti utilizzando i pacchetti di runtime di source-build. Il pacchetto di runtime specifico della distribuzione è incluso nell'SDK di compilazione di origine. Durante la distribuzione autonoma, viene fatto riferimento a questo pacchetto di runtime in bundle, abilitando così la funzionalità per gli utenti.

Modello di applicazione console AOT nativa

Il modello di app console predefinito include ora il supporto per AOT nativamente. Per creare un progetto configurato per la compilazione AOT, è sufficiente eseguire dotnet new console --aot. La configurazione del progetto aggiunta da --aot ha tre effetti:

  • Genera un eseguibile indipendente nativo con AOT nativo quando si pubblica il progetto, ad esempio con dotnet publish o Visual Studio.
  • Abilita gli analizzatori di compatibilità per taglio, AOT e singolo file. Questi analizzatori avvisano l'utente di parti potenzialmente problematiche del progetto (se presenti).
  • Abilita l'emulazione in fase di debug di AOT in modo che quando si esegue il debug del progetto senza compilazione AOT, si ottiene un'esperienza simile a AOT. Ad esempio, se si usa System.Reflection.Emit in un pacchetto NuGet che non è stato annotato per AOT (e pertanto non è stato rilevato dall'analizzatore di compatibilità), l'emulazione significa che non si avranno sorprese quando si tenta di pubblicare il progetto con AOT.

.NET in Linux

Linee di base di supporto minime per Linux

Le baseline minime di supporto per Linux sono state aggiornate per .NET 8. .NET è progettato per Ubuntu 16.04 per tutte le architetture. Questo aspetto è importante soprattutto per definire la versione minima glibc per .NET 8. .NET 8 non verrà avviato nelle versioni di distribuzione che includono un glibc precedente, ad esempio Ubuntu 14.04 o Red Hat Enterprise Linux 7.

Per altre informazioni, vedere Supporto della famiglia Red Hat Enterprise Linux.

Costruisci il tuo .NET su Linux

Nelle versioni precedenti di .NET è possibile compilare .NET dall'origine, ma è necessario creare un "tarball di origine" dal commit del repository dotnet/installer corrispondente a una versione. In .NET 8 non è più necessario ed è possibile compilare .NET in Linux direttamente dal repository dotnet/dotnet . Questo repository usa dotnet/source-build per compilare runtime, strumenti e SDK .NET. Questa è la stessa build usata da Red Hat e Canonical per compilare .NET.

La compilazione in un contenitore è l'approccio più semplice per la maggior parte delle persone, perché le immagini del dotnet-buildtools/prereqs contenitore contengono tutte le dipendenze necessarie. Per altre informazioni, vedere le istruzioni di compilazione.

Verifica della firma NuGet

A partire da .NET 8, NuGet verifica i pacchetti firmati in Linux per impostazione predefinita. NuGet continua a verificare anche i pacchetti firmati in Windows.

La maggior parte degli utenti non dovrebbe notare la verifica. Tuttavia, se si dispone di un bundle di certificato radice esistente che si trova in /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem, è possibile che vengano visualizzati errori di attendibilità accompagnati dall'avviso NU3042.

È possibile rifiutare esplicitamente la verifica impostando la variabile DOTNET_NUGET_SIGNATURE_VERIFICATION di ambiente su false.

Analisi del codice

.NET 8 include diversi nuovi analizzatori di codice e correzioni per verificare che si usino le API della libreria .NET in modo corretto ed efficiente. La tabella seguente riepiloga i nuovi analizzatori.

ID regola Categoria Description
CA1856 Performance Viene generato quando l'attributo ConstantExpectedAttribute non viene applicato correttamente a un parametro.
CA1857 Performance Viene generato quando un parametro viene annotato con ConstantExpectedAttribute ma l'argomento specificato non è una costante.
CA1858 Performance Per determinare se una stringa inizia con un prefisso specificato, è preferibile chiamare String.StartsWith piuttosto che chiamare String.IndexOf e quindi confrontare il risultato con zero.
CA1859 Performance Questa regola consiglia di aggiornare il tipo di variabili locali, campi, proprietà, parametri del metodo e tipi restituiti da tipi di interfaccia o astratti a tipi concreti, quando possibile. L'uso di tipi concreti porta a codice generato di qualità superiore.
CA1860 Performance Per determinare se un tipo di collezione ha elementi, è preferibile usare Length, Count o IsEmpty che chiamare Enumerable.Any.
CA1861 Performance Le matrici costanti passate come argomenti non vengono riutilizzate quando vengono chiamate ripetutamente, il che implica la creazione di una nuova matrice ogni volta. Per migliorare le prestazioni, è consigliabile estrarre la matrice in un campo di sola lettura statico.
CA1865-CA1867 Performance L'overload della funzione char offre prestazioni migliori per una stringa di un singolo carattere.
CA2021 Reliability Enumerable.Cast<TResult>(IEnumerable) e Enumerable.OfType<TResult>(IEnumerable) richiedono tipi compatibili per funzionare correttamente. L'estensione e le conversioni definite dall'utente non sono supportate con tipi generici.
CA1510-CA1513 Manutenibilità Gli throw helper sono più semplici ed efficienti rispetto a un if blocco di codice per costruire una nuova istanza di eccezione. Questi quattro analizzatori sono stati creati per le eccezioni seguenti: ArgumentNullException, ArgumentExceptionArgumentOutOfRangeExceptione ObjectDisposedException.

Diagnostics

Il C# Hot Reload supporta la modifica dei tipi generici

A partire da .NET 8, il ricaricamento rapido C# supporta la modifica di tipi generici e metodi generici. Quando si esegue il debug di applicazioni console, desktop, per dispositivi mobili o WebAssembly con Visual Studio, è possibile applicare modifiche alle classi generiche e ai metodi generici nel codice C# o nelle pagine Razor. Per altre informazioni, vedere l'elenco completo delle modifiche supportate da Roslyn.

Vedere anche