Händelser
17 mars 21 - 21 mars 10
Gå med i mötesserien för att skapa skalbara AI-lösningar baserat på verkliga användningsfall med andra utvecklare och experter.
Registrera dig nuDen här webbläsaren stöds inte längre.
Uppgradera till Microsoft Edge och dra nytta av de senaste funktionerna och säkerhetsuppdateringarna, samt teknisk support.
I den här artikeln beskrivs nya funktioner i .NET SDK och verktyg för .NET 8.
Det här avsnittet innehåller följande underavsnitt:
MSBuild innehåller en ny funktion som gör det enklare att införliva data från MSBuild i dina skript eller verktyg. Följande nya flaggor är tillgängliga för CLI-kommandon som dotnet publish för att hämta data för användning i CI-pipelines och på andra platser.
Flagga | beskrivning |
---|---|
--getProperty:<PROPERTYNAME> |
Hämtar egenskapen MSBuild med det angivna namnet. |
--getItem:<ITEMTYPE> |
Hämtar MSBuild-objekt av den angivna typen. |
--getTargetResults:<TARGETNAME> |
Hämtar utdata från att köra det angivna målet. |
Värden skrivs till standardutdata. Flera eller komplexa värden matas ut som JSON, enligt följande exempel.
>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",
...
]
}
}
dotnet build
har ett nytt alternativ för att skapa mer moderniserade byggutdata. Den här terminalloggaren utdatagrupper fel med projektet de kom från, bättre skiljer de olika målramverken för flera målprojekt och ger realtidsinformation om vad bygget gör. Om du vill välja de nya utdata använder du alternativet --tl
. Mer information om det här alternativet finns i dotnet-byggalternativ.
.NET 8 introducerar ett alternativ för att förenkla utdatasökvägen och mappstrukturen för byggutdata. Tidigare skapade .NET-appar en djup och komplex uppsättning utdatasökvägar för olika byggartefakter. Den nya förenklade utdatasökvägsstrukturen samlar alla byggutdata till en gemensam plats, vilket gör det enklare för verktyg att förutse.
Mer information finns i Artefaktutdatalayout.
.NET 8 introducerar ett nytt kommando för att rensa arbetsbelastningspaket som kan lämnas över via flera .NET SDK- eller Visual Studio-uppdateringar. Om du stöter på problem när du hanterar arbetsbelastningar bör du överväga att använda workload clean
för att återställa till ett känt tillstånd på ett säkert sätt innan du försöker igen. Kommandot har två lägen:
dotnet workload clean
Kör skräpinsamling för arbetsbelastningar för filbaserade eller MSI-baserade arbetsbelastningar, vilket rensar överblivna paket. Överblivna paket kommer från avinstallerade versioner av .NET SDK eller paket där installationsposter för paketet inte längre finns.
Om Visual Studio är installerat visar kommandot även alla arbetsbelastningar som du bör rensa manuellt med Hjälp av Visual Studio.
dotnet workload clean --all
Det här läget är mer aggressivt och rensar varje paket på datorn som är av den aktuella installationstypen för SDK-arbetsbelastningen (och det är inte från Visual Studio). Den tar också bort alla installationsposter för arbetsbelastningar för det .NET SDK-funktionsband som körs och nedan.
dotnet publish
Eftersom kommandona och dotnet pack
är avsedda att producera produktionstillgångar skapar Release
de nu tillgångar som standard.
Följande utdata visar det olika beteendet mellan dotnet build
och dotnet publish
och hur du kan återgå till att publicera Debug
tillgångar genom att ange PublishRelease
egenskapen till 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/
Mer information finns i "dotnet pack" använder Versionskonfiguration och "dotnet publish" använder Versionskonfiguration.
Från och med .NET 8 kan du välja säkerhetskontroller för kända säkerhetsrisker när beroendepaket återställs. Den här granskningsåtgärden genererar en rapport över säkerhetsrisker med det berörda paketnamnet, sårbarhetens allvarlighetsgrad och en länk till rekommendationen för mer information. När du kör dotnet add
eller dotnet restore
visas varningar nu1901-NU1904 för eventuella säkerhetsrisker som hittas. Mer information finns i Granskning av säkerhetsrisker.
Mallmotorn ger en säkrare upplevelse i .NET 8 genom att integrera några av NuGets säkerhetsrelaterade funktioner. Förbättringarna innefattar:
Förhindra att paket laddas ned från http://
feeds som standard. Följande kommando kan till exempel inte installera mallpaketet eftersom käll-URL:en inte använder HTTPS.
dotnet new install console --add-source "http://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public/nuget/v3/index.json"
Du kan åsidosätta den här begränsningen --force
med hjälp av flaggan.
För dotnet new
, dotnet new install
och dotnet new update
, kontrollerar du om det finns kända säkerhetsrisker i mallpaketet. Om säkerhetsrisker hittas och du vill fortsätta måste du använda --force
flaggan.
För dotnet new
anger du information om mallpaketets ägare. Ägarskapet verifieras av NuGet-portalen och kan betraktas som en tillförlitlig egenskap.
För dotnet search
och dotnet uninstall
anger du om en mall är installerad från ett paket som är "betrott", dvs. det använder ett reserverat prefix.
Source Link ingår nu i .NET SDK. Målet är att genom att paketera Source Link i SDK:t, i stället för att kräva en separat <PackageReference>
för paketet, innehåller fler paket den här informationen som standard. Den informationen förbättrar IDE-upplevelsen för utvecklare.
Anteckning
Som en bieffekt av den här ändringen ingår incheckningsinformation i InformationalVersion
värdet för inbyggda bibliotek och program, även de som riktar sig mot .NET 7 eller en tidigare version. Mer information finns i Källlänk som ingår i .NET SDK.
Linux-distributionsbyggda SDK :et (source-build) har nu möjlighet att skapa fristående program med hjälp av källversionskörningspaketen. Det distributionsspecifika körningspaketet paketeras med källversionens SDK. Under den fristående distributionen refereras det här paketerade körningspaketet till, vilket aktiverar funktionen för användare.
Alternativet att publicera som intern AOT introducerades först i .NET 7. När du publicerar en app med intern AOT skapas en helt fristående version av din app som inte behöver någon körning – allt ingår i en enda fil. .NET 8 ger följande förbättringar av intern AOT-publicering:
Lägger till stöd för x64- och Arm64-arkitekturerna i macOS.
Minskar storleken på interna AOT-appar i Linux med upp till 50 %. I följande tabell visas storleken på en "Hello World"-app som publicerats med intern AOT som innehåller hela .NET-körningen på .NET 7 jämfört med .NET 8:
Operativsystem | .NET 7 | .NET 8 |
---|---|---|
Linux x64 (med -p:StripSymbols=true ) |
3,76 MB | 1,84 MB |
Windows x64 | 2,85 MB | 1,77 MB |
Gör att du kan ange en optimeringsinställning: storlek eller hastighet. Som standard väljer kompilatorn att generera snabb kod samtidigt som den är medveten om programmets storlek. Du kan dock använda <OptimizationPreference>
egenskapen MSBuild för att optimera specifikt för den ena eller den andra. Mer information finns i Optimera AOT-distributioner.
Standardmallen för konsolappen innehåller nu stöd för AOT out-of-the-box. Om du vill skapa ett projekt som har konfigurerats för AOT-kompilering kör dotnet new console --aot
du bara . Projektkonfigurationen som läggs till av --aot
har tre effekter:
dotnet publish
eller Visual Studio..NET 8 startar arbetet med att aktivera internt AOT-stöd för iOS-liknande plattformar. Nu kan du skapa och köra .NET iOS- och .NET MAUI-program med intern AOT på följande plattformar:
ios
iossimulator
maccatalyst
tvos
tvossimulator
Preliminära tester visar att appstorleken på disken minskar med cirka 35 % för .NET iOS-appar som använder intern AOT i stället för Mono. Appstorleken på disken för .NET MAUI iOS-appar minskar med upp till 50 %. Dessutom är starttiden också snabbare. .NET iOS-appar har ungefär 28 % snabbare starttid, medan .NET MAUI iOS-appar har ungefär 50 % bättre startprestanda jämfört med Mono. .NET 8-stödet är experimentellt och bara det första steget för funktionen som helhet. Mer information finns i blogginlägget om prestandaförbättringar för .NET 8 i .NET MAUI.
Inbyggt AOT-stöd är tillgängligt som en opt-in-funktion som är avsedd för appdistribution. Mono är fortfarande standardkörningen för apputveckling och distribution. Om du vill skapa och köra ett .NET MAUI-program med intern AOT på en iOS-enhet använder du dotnet workload install maui
för att installera .NET MAUI-arbetsbelastningen och dotnet new maui -n HelloMaui
för att skapa appen. Ange sedan egenskapen PublishAot
MSBuild till true
i projektfilen.
<PropertyGroup>
<PublishAot>true</PublishAot>
</PropertyGroup>
När du anger den obligatoriska egenskapen och kör dotnet publish
som i följande exempel distribueras appen med hjälp av intern AOT.
dotnet publish -f net8.0-ios -c Release -r ios-arm64 /t:Run
Alla iOS-funktioner är inte kompatibla med intern AOT. På samma sätt är inte alla bibliotek som ofta används i iOS kompatibla med NativeAOT. Utöver de befintliga begränsningarna för intern AOT-distribution visar följande lista några av de andra begränsningarna när du riktar in dig på iOS-liknande plattformar:
dotnet publish
).För att minska appstorleken använder .NET- och .NET MAUI-appar som riktar sig mot Android profilerat i förväg (AOT) kompileringsläge när de är inbyggda i versionsläge. Profilerad AOT-kompilering påverkar färre metoder än vanlig AOT-kompilering. .NET 8 introducerar egenskapen <AndroidStripILAfterAOT>
där du kan välja ytterligare AOT-kompilering för Android-appar för att minska appstorleken ännu mer.
<PropertyGroup>
<AndroidStripILAfterAOT>true</AndroidStripILAfterAOT>
</PropertyGroup>
Som standard åsidosätter inställningen AndroidStripILAfterAOT
true
standardinställningen AndroidEnableProfiledAot
så att (nästan) alla metoder som AOT-kompilerats kan trimmas. Du kan också använda profilerad AOT- och IL-borttagning genom att uttryckligen ange båda egenskaperna till true
:
<PropertyGroup>
<AndroidStripILAfterAOT>true</AndroidStripILAfterAOT>
<AndroidEnableProfiledAot>true</AndroidEnableProfiledAot>
</PropertyGroup>
När du skapar appar som riktar in sig på Windows på icke-Windows-plattformar uppdateras den resulterande körbara filen nu med alla angivna Win32-resurser, till exempel programikon, manifest, versionsinformation.
Tidigare var program tvungna att byggas på Windows för att ha sådana resurser. Att åtgärda den här klyftan i stöd för korsbyggande har varit en populär begäran, eftersom det var en betydande smärtpunkt som påverkade både infrastrukturkomplexitet och resursanvändning.
De minsta stödbaslinjerna för Linux har uppdaterats för .NET 8. .NET har skapats för Ubuntu 16.04 för alla arkitekturer. Det är främst viktigt för att definiera den lägsta glibc
versionen för .NET 8. .NET 8 startar inte på distributionsversioner som innehåller en äldre glibc, till exempel Ubuntu 14.04 eller Red Hat Enterprise Linux 7.
Mer information finns i Stöd för Red Hat Enterprise Linux-familjen.
I tidigare .NET-versioner kunde du skapa .NET från källan, men det krävdes att du skapade en "källtarball" från dotnet/installer-lagringsplatsen som motsvarade en version. I .NET 8 är det inte längre nödvändigt och du kan skapa .NET på Linux direkt från dotnet-/dotnet-lagringsplatsen . Den lagringsplatsen använder dotnet/source-build för att skapa .NET-runtimes, verktyg och SDK:er. Det här är samma version som Red Hat och Canonical använder för att skapa .NET.
Att skapa i en container är den enklaste metoden för de flesta, eftersom containeravbildningarna dotnet-buildtools/prereqs
innehåller alla nödvändiga beroenden. Mer information finns i bygginstruktionerna.
Från och med .NET 8 verifierar NuGet signerade paket i Linux som standard. NuGet fortsätter även att verifiera signerade paket i Windows.
De flesta användare bör inte märka verifieringen. Men om du har ett befintligt rotcertifikatpaket som finns på /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem, kan du se förtroendefel tillsammans med varnings-NU3042.
Du kan avregistrera dig från verifieringen genom att ange miljövariabeln DOTNET_NUGET_SIGNATURE_VERIFICATION
till false
.
.NET 8 innehåller flera nya kodanalysverktyg och korrigeringar som hjälper dig att kontrollera att du använder .NET-biblioteks-API:er korrekt och effektivt. I följande tabell sammanfattas de nya analysverktygen.
Regel-ID | Kategori | beskrivning |
---|---|---|
CA1856 | Prestanda | Utlöses ConstantExpectedAttribute när attributet inte tillämpas korrekt på en parameter. |
CA1857 | Prestanda | Utlöses när en parameter kommenteras med ConstantExpectedAttribute men det angivna argumentet inte är en konstant. |
CA1858 | Prestanda | För att avgöra om en sträng börjar med ett angivet prefix är det bättre att anropa String.StartsWith än att anropa String.IndexOf och sedan jämföra resultatet med noll. |
CA1859 | Prestanda | Den här regeln rekommenderar att du uppgraderar typen av specifika lokala variabler, fält, egenskaper, metodparametrar och metodreturtyper från gränssnittstyper eller abstrakta typer till konkreta typer när det är möjligt. Användning av konkreta typer leder till kod som genereras av högre kvalitet. |
CA1860 | Prestanda | För att avgöra om en samlingstyp har några element är det bättre att använda Length , Count eller IsEmpty än att anropa Enumerable.Any. |
CA1861 | Prestanda | Konstanta matriser som skickas som argument återanvänds inte när de anropas upprepade gånger, vilket innebär att en ny matris skapas varje gång. För att förbättra prestandan bör du överväga att extrahera matrisen till ett statiskt skrivskyddat fält. |
CA1865-CA1867 | Prestanda | Överlagringen av tecken är en bättre överlagring för en sträng med ett enda tecken. |
CA2021 | Tillförlitlighet | Enumerable.Cast<TResult>(IEnumerable) och Enumerable.OfType<TResult>(IEnumerable) kräver kompatibla typer för att fungera korrekt. Breddning och användardefinierade konverteringar stöds inte med generiska typer. |
CA1510-CA1513 | Underhållsmöjlighet | Throw-hjälpen är enklare och effektivare än ett if block som skapar en ny undantagsinstans. Dessa fyra analysverktyg skapades för följande undantag: ArgumentNullException, ArgumentExceptionoch ArgumentOutOfRangeException ObjectDisposedException. |
Från och med .NET 8 stöder C# Frekvent omläsning ändring av generiska typer och generiska metoder. När du felsöker konsol-, skrivbords-, mobil- eller WebAssembly-program med Visual Studio kan du tillämpa ändringar på allmänna klasser och generiska metoder i C#-kod eller Razor-sidor. Mer information finns i den fullständiga listan över redigeringar som stöds av Roslyn.
Feedback om .NET
.NET är ett öppen källkod projekt. Välj en länk för att ge feedback:
Händelser
17 mars 21 - 21 mars 10
Gå med i mötesserien för att skapa skalbara AI-lösningar baserat på verkliga användningsfall med andra utvecklare och experter.
Registrera dig nuUtbildning
Utbildningsväg
Skapa molnbaserade appar och tjänster med .NET och ASP.NET Core - Training
Skapa självständigt distribuerade, mycket skalbara och motståndskraftiga appar och tjänster med hjälp av den kostnadsfria .NET-plattformen med öppen källkod. Med .NET kan du använda populär mikrotjänstteknik som Docker, Kubernetes, Dapr, Azure Container Registry med mera för .NET- och ASP.NET Core-program och -tjänster.
Dokumentation
Lär dig mer om de nya .NET-funktionerna som introducerades i .NET 8-körningen.
Lär dig mer om de nya .NET-funktionerna som introducerades i .NET 8.
Lär dig mer om de nya funktionerna som introduceras i .NET 7.