Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I den här artikeln beskrivs nya funktioner och förbättringar i .NET SDK för .NET 10. Den har uppdaterats för RC 2.
Förbättringar av .NET-verktyg
Plattformsspecifika .NET-verktyg
.NET-verktyg kan nu publiceras med stöd för flera RuntimeIdentifiers (RID) i ett enda paket. Verktygsförfattare kan paketera binärfiler för alla plattformar som stöds, och .NET CLI kommer att välja rätt binärfiler vid installation eller körning. Detta gör det mycket enklare att redigera och distribuera plattformsoberoende verktyg.
Dessa förbättrade verktyg stöder olika förpackningsvariationer:
- Ramverksberoende, plattformsoberoende (klassiskt läge, körs var som helst med .NET 10 installerat)
- Ramverksberoende, plattformsspecifik (mindre, optimerad för varje plattform)
- Fristående, plattformsspecifik (inkluderar körningen, ingen .NET-installation krävs)
- Trimmad, plattformsspecifik (mindre, trimmar oanvänd kod)
- AOT-kompilerad, plattformsspecifik (maximal prestanda och minsta distribution)
Dessa nya verktyg fungerar ungefär som vanliga publicerade program, så alla publiceringsalternativ som du kan använda med program (till exempel fristående, trimmade eller AOT) kan även gälla för verktyg.
Körning av enstaka verktyg
Du kan nu använda dotnet tool exec kommandot för att köra ett .NET-verktyg utan att installera det globalt eller lokalt. Detta är särskilt värdefullt för CI/CD eller tillfällig användning.
dotnet tool exec --source ./artifacts/package/ dotnetsay "Hello, World!"
Tool package dotnetsay@1.0.0 will be downloaded from source <source>.
Proceed? [y/n] (y): y
_ _ _ _ __ __ _ _ _
| | | | ___ | | | | ___ \ \ / / ___ _ __ | | __| | | |
| |_| | / _ \ | | | | / _ \ \ \ /\ / / / _ \ | '__| | | / _` | | |
| _ | | __/ | | | | | (_) | _ \ V V / | (_) | | | | | | (_| | |_|
|_| |_| \___| |_| |_| \___/ ( ) \_/\_/ \___/ |_| |_| \__,_| (_)
|/
Detta laddar ned och kör det angivna verktygspaketet i ett kommando. Som standard uppmanas användarna att bekräfta nedladdningen om verktyget inte redan finns lokalt. Den senaste versionen av det valda verktygspaketet används om inte en explicit version har angetts (till exempel dotnetsay@0.1.0).
Enstaka verktygskörning fungerar sömlöst med lokala verktygsmanifest. Om du kör ett verktyg från en plats som innehåller en .config/dotnet-tools.json i närheten används versionen av verktyget i konfigurationen i stället för den senaste tillgängliga versionen.
Det nya dnx verktygskörningsskriptet
Skriptet dnx ger ett effektivt sätt att köra verktyg. Den vidarebefordrar alla argument till dotnet CLI för bearbetning, vilket gör verktygsanvändningen så enkel som möjligt:
dnx dotnetsay "Hello, World!"
Den faktiska implementeringen av dnx kommandot finns i dotnet själva CLI, vilket gör att dess beteende kan utvecklas över tid.
Mer information om hur du hanterar .NET-verktyg finns i Hantera .NET-verktyg.
any Använda RuntimeIdentifier med plattformsspecifika .NET-verktyg
Den plattformsspecifika .NET-verktygsfunktionen är bra för att se till att verktygen är optimerade för specifika plattformar som du riktar in dig på i förväg. Det finns dock tillfällen då du inte känner till alla plattformar som du vill rikta in dig på, eller ibland kommer .NET självt att lära sig att stödja en ny plattform, och du vill att ditt verktyg också ska kunna köras där.
Om du vill att verktyget ska fungera på det här sättet lägger du till any körningsidentifieraren i projektfilen:
<PropertyGroup>
<RuntimeIdentifiers>
linux-x64;
linux-arm64;
macos-arm64;
win-x64;
win-arm64;
any
</RuntimeIdentifiers>
</PropertyGroup>
Den här RuntimeIdentifier är "roten" för kontrollen av plattformskompatibilitet, och eftersom den deklarerar stöd för alla plattformar är verktyget som paketeras den mest kompatibla typen av verktyg – en ramverksberoende, plattformsoberoende .NET DLL, som kräver en kompatibel .NET Runtime för att köra. När du utför en dotnet pack för att skapa verktyget visas ett nytt paket för any RuntimeIdentifier tillsammans med de andra plattformsspecifika paketen och manifestpaketet på den översta nivån.
CLI-introspektion med --cli-schema
Ett nytt --cli-schema alternativ är tillgängligt för alla CLI-kommandon. När den används matar den ut en JSON-representation av CLI-kommandoträdet för det anropade kommandot eller underkommandot. Detta är användbart för verktygsförfattare, gränssnittsintegrering och avancerad skriptning.
dotnet clean --cli-schema
Utdata ger en strukturerad, maskinläsbar beskrivning av kommandots argument, alternativ och underkommandon:
{
"name": "clean",
"version": "10.0.100-dev",
"description": ".NET Clean Command",
"arguments": {
"PROJECT | SOLUTION": {
"description": "The project or solution file to operate on. If a file is not specified, the command will search the current directory for one.",
"arity": { "minimum": 0, "maximum": null }
}
},
"options": {
"--artifacts-path": {
"description": "The artifacts path. All output from the project, including build, publish, and pack output, will go in subfolders under the specified path.",
"helpName": "ARTIFACTS_DIR"
}
},
"subcommands": {}
}
Använd .NET MSBuild-aktiviteter med .NET Framework MSBuild
MSBuild är det underliggande byggsystemet för .NET, som driver både bygget av projekt (som i kommandon som dotnet build och dotnet pack) och fungerar som en allmän leverantör av information om projekt (vilket visas i kommandon som dotnet list package, och implicit används av kommandon som dotnet run för att upptäcka hur ett projekt vill köras).
När du kör dotnet CLI-kommandon är den version av MSBuild som används den som levereras med .NET SDK. Men när du använder Visual Studio eller anropar MSBuild direkt är den version av MSBuild som används den som installeras med Visual Studio. Den här miljöskillnaden har några viktiga konsekvenser. Det viktigaste är att MSBuild som körs i Visual Studio (eller via msbuild.exe) är ett .NET Framework-program, medan MSBuild som körs i dotnet CLI är ett .NET-program. Det innebär att alla MSBuild-uppgifter som skrivs för att köras på .NET inte kan användas när du skapar i Visual Studio eller när du använder msbuild.exe.
Från och med .NET 10 msbuild.exe och Visual Studio 2026 kan du köra MSBuild-uppgifter som har skapats för .NET. Det innebär att du nu kan använda samma MSBuild-uppgifter när du skapar i Visual Studio eller använder msbuild.exe som du gör när du skapar med dotnet CLI. För de flesta .NET-användare ändras ingenting. Men för författare av anpassade MSBuild-uppgifter innebär det att du nu kan skriva dina uppgifter för att rikta in dig på .NET och få dem att fungera överallt. Målet med den här ändringen är att göra det enklare att skriva och dela MSBuild-uppgifter och att tillåta aktivitetsförfattare att dra nytta av de senaste funktionerna i .NET. Dessutom minskar den här ändringen svårigheterna med aktiviteter med flera mål för att stödja både .NET Framework och .NET och hantera versioner av .NET Framework-beroenden som är implicit tillgängliga i MSBuild .NET Framework-körningsutrymmet.
Konfigurera .NET-uppgifter
För uppgiftsförfattare är det enkelt att välja det här nya beteendet. Ändra bara UsingTask-deklarationen för att berätta för MSBuild om din uppgift.
<UsingTask TaskName="MyTask"
AssemblyFile="path\to\MyTask.dll"
Runtime="NET"
TaskFactory="TaskHostFactory"
/>
Attributen Runtime="NET" och TaskFactory="TaskHostFactory" talar om för MSBuild-motorn hur uppgiften ska köras:
-
Runtime="NET"anger för MSBuild att uppgiften har skapats för .NET (till skillnad från .NET Framework). -
TaskFactory="TaskHostFactory"instruerar MSBuild att användaTaskHostFactoryför att köra uppgiften, vilket är en befintlig funktion i MSBuild som gör att aktiviteter kan köras ut ur processen.
Varningar och prestandajustering
Föregående exempel är det enklaste sättet att komma igång med .NET-uppgifter i MSBuild, men det har vissa begränsningar. Eftersom TaskHostFactory alltid kör uppgifter utanför processen, körs den nya .NET-uppgiften alltid i en separat process, skild från den som MSBuild kör. Det innebär att det finns en del mindre omkostnader för att köra aktiviteten eftersom MSBuild-motorn och uppgiften kommunicerar via kommunikation mellan processer (IPC) i stället för processkommunikation. För de flesta uppgifter är den här kostnaden försumbar, men för uppgifter som körs många gånger i en version, eller som utför mycket loggning, kan den här kostnaden vara mer betydande.
Med bara lite mer arbete kan du konfigurera uppgiften så att den fortfarande körs i processen när den körs via dotnet:
<UsingTask TaskName="MyTask"
AssemblyFile="path\to\MyTask.dll"
Runtime="NET"
TaskFactory="TaskHostFactory"
Condition="$(MSBuildRuntimeType) == 'Full'"
/>
<UsingTask TaskName="MyTask"
AssemblyFile="path\to\MyTask.dll"
Runtime="NET"
Condition="$(MSBuildRuntimeType) == 'Core'"
/>
Tack vare Condition funktionen i MSBuild kan du läsa in en uppgift på olika sätt beroende på om MSBuild körs i .NET Framework (Visual Studio eller msbuild.exe) eller .NET ( dotnet CLI). I det här exemplet körs uppgiften utanför processen när den körs i Visual Studio eller msbuild.exe, men körs inom processen när den körs i dotnet CLI. Detta ger bästa prestanda när den körs i dotnet CLI, samtidigt som Tasken kan användas i Visual Studio och msbuild.exe.
Det finns också små tekniska begränsningar att vara medveten om när du använder .NET Tasks i MSBuild—det mest anmärkningsvärda är att MSBuild Tasks-funktionen ännu inte stöds för .NET Tasks som körs utanför processen. Det innebär att om din uppgift förlitar sig på ett värdobjekt fungerar den inte när den körs i Visual Studio eller msbuild.exe. Ytterligare stöd för värdobjekt planeras i framtida versioner.
Förbättringar av filbaserade appar
.NET 10 ger betydande uppdateringar av den filbaserade appupplevelsen, inklusive publiceringsstöd och interna AOT-funktioner. En introduktion till filbaserade appar finns i Filbaserade appar och Skapa och köra C#-program.
Förbättrade filbaserade appar med publiceringsstöd och intern AOT
Filbaserade appar stöder nu publicering till inbyggda körbara filer via dotnet publish app.cs kommandot, vilket gör det enklare att skapa enkla appar som du kan distribuera om som inbyggda körbara filer. Alla filbaserade appar riktar nu in sig på intern AOT som standard. Om du behöver använda paket eller funktioner som inte är kompatibla med inbyggd AOT kan du inaktivera detta med hjälp av #:property PublishAot=false direktivet i din .cs-fil.
Filbaserade appar innehåller även förbättrade funktioner:
-
Projektreferenser: Stöd för att referera till projekt via
#:projectdirektivet. -
Åtkomst till körningssökväg: Appfiler och kataloger är tillgängliga under körning via
System.AppContext.GetData. - Förbättrat stöd för shebang: Direkt shellkörning med förbättrad hantering av shebang, inklusive stöd för tilläggslösa filer.
Exempel på projektreferenser
#:project ../ClassLib/ClassLib.csproj
var greeter = new ClassLib.Greeter();
var greeting = greeter.Greet(args.Length > 0 ? args[0] : "World");
Console.WriteLine(greeting);
Förbättrat exempel på shebang-stöd
Nu kan du skapa körbara C#-filer som körs direkt från gränssnittet:
#!/usr/bin/env dotnet
Console.WriteLine("Hello shebang!");
För tilläggslösa filer:
# 1. Create a single-file C# app with a shebang
cat << 'EOF' > hello.cs
#!/usr/bin/env dotnet
Console.WriteLine("Hello!");
EOF
# 2. Copy it (extensionless) into ~/utils/hello (~/utils is on my PATH)
mkdir -p ~/utils
cp hello.cs ~/utils/hello
# 3. Mark it executable
chmod +x ~/utils/hello
# 4. Run it directly from anywhere
cd ~
hello
De här förbättringarna gör filbaserade appar mer kraftfulla samtidigt som de bevarar sin enkelhet för snabba skript och prototypscenarier.
Mer information om intern AOT finns i .NET native AOT.
Beskärning av paketreferenser som tillhandahålls av ramverket
Från och med .NET 10 kan nuget-granskningsfunktionenbeskära paketreferenser som tillhandahålls av ramverk som inte används av projektet. Den här funktionen är som standard aktiverad för alla ramverk i ett projekt som riktar sig mot .NET 10.0 med den senaste SDK. Den här ändringen bidrar till att minska antalet paket som återställs och analyseras under byggprocessen, vilket kan leda till snabbare byggtider och minskad diskutrymmesanvändning. Det kan också minska antalet falska positiva resultat från granskning med NuGet och andra beroendeskanningsmekanismer.
När den här funktionen är aktiverad kan du se en minskning av innehållet i dina program genererade .deps.json filer. Alla paketreferenser som tillhandahålls av .NET-körningen tas automatiskt bort från den genererade beroendefilen.
När en direkt paketreferens är inom beskärningsintervallet tillämpas
Även om den här funktionen är aktiverad som standard för de listade TFM:erna kan du inaktivera den genom att ange egenskapen RestoreEnablePackagePruning till false i projektfilen eller Directory.Build.props fil.
Mer konsekvent kommandoordning
Från och med .NET 10 innehåller verktyget dotnet CLI nya alias för vanliga kommandon för att göra dem enklare att komma ihåg och skriva. De nya kommandona visas i följande tabell.
| Nytt substantivformulär | Alias för |
|---|---|
dotnet package add |
dotnet add package |
dotnet package list |
dotnet list package |
dotnet package remove |
dotnet remove package |
dotnet reference add |
dotnet add reference |
dotnet reference list |
dotnet list reference |
dotnet reference remove |
dotnet remove reference |
De nya substantiv-första formulären överensstämmer med allmänna CLI-standarder, vilket gör dotnet CLI mer konsekvent med andra verktyg. Även om de verb-första formulären fortsätter att fungera är det bättre att använda substantiv-första formulären för bättre läsbarhet och konsekvens i skript och dokumentation.
CLI-kommandon körs som standard i interaktivt läge i interaktiva terminaler
Flaggan --interactive är nu aktiverad som standard för CLI-kommandon i interaktiva terminaler. Den här ändringen gör det möjligt för kommandon att dynamiskt hämta autentiseringsuppgifter eller utföra andra interaktiva beteenden utan att kräva att flaggan uttryckligen anges. För icke-interaktiva scenarier kan du inaktivera interaktivitet genom att --interactive falseange .
Skript för inbyggt gränssnitt för tab-completion
dotnet CLI har nu stöd för att generera inbyggda tab-completion-skript för populära gränssnitt med hjälp av dotnet completions generate [SHELL] kommandot . Gränssnitt som stöds är bash, fish, nushell, powershelloch zsh. Dessa skript förbättrar användbarheten genom att tillhandahålla snabbare och mer integrerade tab-completion-funktioner. I PowerShell kan du till exempel aktivera slutföranden genom att lägga till följande i :$PROFILE
dotnet completions script pwsh | out-String | Invoke-Expression -ErrorAction SilentlyContinue
Konsolappar kan skapa containeravbildningar internt
Konsolappar kan nu skapa containeravbildningar via dotnet publish /t:PublishContainer utan att kräva egenskapen <EnableSdkContainerSupport> i projektfilen. Detta justerar konsolappar med beteendet för ASP.NET Core- och Worker SDK-appar.
Kontrollera uttryckligen avbildningsformatet för containrar
Med en ny <ContainerImageFormat> egenskap kan du uttryckligen ange formatet för containeravbildningar till antingen Docker eller OCI. Den här egenskapen åsidosätter standardbeteendet, vilket beror på basavbildningsformatet och om containern är multiarkitektur.
Stöd för Microsoft Testing Platform i dotnet test
Från och med .NET 10 dotnet test har inbyggt stöd för Microsoft.Testing.Platform. Om du vill aktivera den här funktionen lägger du till följande konfiguration i filenglobal.json :
{
"test": {
"runner": "Microsoft.Testing.Platform"
}
}
Mer information finns i Testa med dotnet test.