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.
När du riktar in dig på ett ramverk i en app eller ett bibliotek anger du den uppsättning API:er som du vill göra tillgängliga för appen eller biblioteket. Du anger målramverket i projektfilen med hjälp av en målramverksmoniker (TFM).
En app eller ett bibliotek kan rikta in sig på en version av .NET Standard. .NET Standard-versioner representerar standardiserade uppsättningar API:er för alla .NET-implementeringar. Ett bibliotek kan till exempel rikta in sig på .NET Standard 1.6 och få åtkomst till API:er som fungerar i .NET Core och .NET Framework med samma kodbas.
En app eller ett bibliotek kan också rikta in sig på en specifik .NET-implementering för att få åtkomst till implementeringsspecifika API:er. Till exempel har en app som riktar sig mot Universal Windows Platform (UWP, uap10.0
) åtkomst till API:er som kompileras för enheter som kör Windows 10.
För vissa målramverk, till exempel .NET Framework, definieras API:erna av de sammansättningar som ramverket installerar i ett system och kan innehålla API:er för programramverk (till exempel ASP.NET).
För paketbaserade målramverk (till exempel .NET 5+, .NET Core och .NET Standard) definieras API:erna av De NuGet-paket som ingår i appen eller biblioteket.
De senaste versionerna
I följande tabell definieras de vanligaste målramverken, hur de refereras och vilken version av .NET Standard de implementerar. Dessa målramverksversioner är de senaste stabila versionerna. Förhandsversioner visas inte. Ett målramverksmoniker (TFM) är ett standardiserat tokenformat för att ange målramverket för en .NET-app eller ett bibliotek.
Målramverk | Senaste stabil version |
Målnamn för ramverk (TFM) | Implementerad .NET Standard-version |
---|---|---|---|
.NET 9 | 9 | net9.0 | 2.1 |
.NET 8 | 8 | net8.0 | 2.1 |
.NET Standard | 2.1 | netstandard2.1 | Ej tillämpligt |
.NET Core | 3.1 | netcoreapp3.1 | 2.1 |
.NET Framework | 4.8.1 | net481 | 2.0 |
Målramverk som stöds
Ett målramverk refereras vanligtvis av en TFM. I följande tabell visas de målramverk som stöds av .NET SDK och NuGet-klienten. Motsvarigheter visas inom hakparenteser. Till exempel win81
är en motsvarande TFM till netcore451
.
Målramverk | TFM |
---|---|
.NET 5+ (och .NET Core) | netcoreapp1.0 netcoreapp1.1 netcoreapp2.0 netcoreapp2.1 netcoreapp2.2 netcoreapp3.0 netcoreapp3.1 net5.0* net6.0* net7.0* net8.0* net9.0* |
.NET Standard | netstandard1.0 netstandard1.1 netstandard1.2 netstandard1.3 netstandard1.4 netstandard1.5 netstandard1.6 netstandard2.0 netstandard2.1 |
.NET Framework | net11 net20 net35 net40 net403 net45 net451 net452 net46 net461 net462 net47 net471 net472 net48 net481 |
Windows Store | netcore [netcore45] netcore45 [win] [win8] netcore451 [win81] |
.NET nanoFramework | netnano1.0 |
.NET Micro Framework | netmf |
Silverlight | sl4 sl5 |
Windows Phone | wp [wp7] wp7 wp75 wp8 wp81 wpa81 |
Universell Windows-plattform | uap [uap10.0] uap10.0 [win10] [netcore50] |
* .NET 5 och senare TFM:er innehåller vissa operativsystemspecifika varianter. Mer information finns i följande avsnitt, .NET 5+ OS-specifika TFM:er.
.NET 5+ OS-specifika TFM:er
De net5.0
, net6.0
, net7.0
, net8.0
och net9.0
TFM:er innehåller tekniker som fungerar på olika plattformar. Om du anger en OS-specifik TFM blir API:er som är specifika för ett operativsystem tillgängliga för din app, till exempel Windows Forms- eller iOS-bindningar. OS-specifika TFM ärver också varje API som är tillgängligt för sina bas-TFM, till exempel net9.0
TFM.
.NET 5 introducerade den net5.0-windows
OS-specifika TFM som innehåller Windows-specifika bindningar för WinForms, WPF och UWP-API:er. .NET 6- och senare versioner har ytterligare OS-specifika TFM:er, till exempel net6.0-ios
.
I följande tabell visas kompatibiliteten för .NET 5+ TFM:er.
TFM | Kompatibel med |
---|---|
net5.0 |
net1..4 (med NU1701-varning) netcoreapp1.. 3.1 (varning när WinForms eller WPF refereras) netstandard1.. 2.1 |
net5.0-windows |
netcoreapp1.. 3.1 (plus allt annat ärvt från net5.0 ) |
net6.0 |
(Efterföljande version av net5.0 ) |
net6.0-android |
xamarin.android (plus allt annat ärvt från net6.0 ) |
net6.0-ios |
Allt ärvt från net6.0 |
net6.0-maccatalyst |
Allt ärvt från net6.0 |
net6.0-macos |
Allt ärvt från net6.0 |
net6.0-tvos |
Allt ärvt från net6.0 |
net6.0-windows |
(Efterföljande version av net5.0-windows ) |
net7.0 |
(Efterföljande version av net6.0 ) |
net7.0-android |
(Efterföljande version av net6.0-android ) |
net7.0-ios |
(Efterföljande version av net6.0-ios ) |
net7.0-maccatalyst |
(Efterföljande version av net6.0-maccatalyst ) |
net7.0-macos |
(Efterföljande version av net6.0-macos ) |
net7.0-tizen |
tizen40 (plus allt annat ärvt från net7.0 ) |
net7.0-tvos |
(Efterföljande version av net6.0-tvos ) |
net7.0-windows |
(Efterföljande version av net6.0-windows ) |
net8.0 |
(Efterföljande version av net7.0 ) |
net8.0-android |
(Efterföljande version av net7.0-android ) |
net8.0-browser |
Allt ärvt från net8.0 |
net8.0-ios |
(Efterföljande version av net7.0-ios ) |
net8.0-maccatalyst |
(Efterföljande version av net7.0-maccatalyst ) |
net8.0-macos |
(Efterföljande version av net7.0-macos ) |
net8.0-tizen |
(Efterföljande version av net7.0-tizen ) |
net8.0-tvos |
(Efterföljande version av net7.0-tvos ) |
net8.0-windows |
(Efterföljande version av net7.0-windows ) |
net9.0 |
(Efterföljande version av net8.0 ) |
net9.0-android |
(Efterföljande version av net8.0-android ) |
net9.0-browser |
(Efterföljande version av net8.0-browser ) |
net9.0-ios |
(Efterföljande version av net8.0-ios ) |
net9.0-maccatalyst |
(Efterföljande version av net8.0-maccatalyst ) |
net9.0-macos |
(Efterföljande version av net8.0-macos ) |
net9.0-tizen |
(Efterföljande version av net8.0-tizen ) |
net9.0-tvos |
(Efterföljande version av net8.0-tvos ) |
net9.0-windows |
(Efterföljande version av net8.0-windows ) |
Om du vill göra din app portabel på olika plattformar men fortfarande har åtkomst till OS-specifika API:er kan du rikta in dig på flera OS-specifika TFM:er och lägga till plattformsskydd runt OS-specifika API-anrop med hjälp av #if
förprocessordirektiv. En lista över tillgängliga symboler finns i Preprocessor-symboler.
Föreslagna mål
Använd dessa riktlinjer för att avgöra vilken TFM som ska användas i din app:
- Appar som är portabla till flera plattformar bör rikta in sig på en bas-TFM,
net9.0
till exempel . Detta omfattar de flesta bibliotek men även ASP.NET Core och Entity Framework. - Plattformsspecifika bibliotek bör rikta in sig på plattformsspecifika smaker. Till exempel bör WinForms- och WPF-projekt rikta in sig på
net9.0-windows
. - Plattformsoberoende programmodeller (till exempel ASP.NET Core) bör åtminstone rikta in sig på den grundläggande TFM, till exempel
net9.0
, men kan också anpassas till ytterligare plattformsspecifika varianter för att aktivera fler API:er eller funktioner.
OS-version i TFM:er
Du kan också ange en valfri os-version i slutet av en OS-specifik TFM, till exempel net6.0-ios15.0
. Versionen anger vilka API:er som är tillgängliga för din app eller ditt bibliotek. Den styr inte den operativsystemversion som din app eller ditt bibliotek stöder vid körning. Den används för att välja de referenssammansättningar som ditt projekt kompilerar mot och för att välja tillgångar från NuGet-paket. Tänk på den här versionen som "plattformsversion" eller "OS API-version" för att skilja den från körningsoperativsystemets version.
.NET SDK är utformat för att kunna stödja nyligen släppta API:er för en enskild plattform utan en ny version av bas-TFM. På så sätt kan du komma åt plattformsspecifika funktioner utan att vänta på en större version av .NET. Du kan få åtkomst till dessa nyligen släppta API:er genom att öka plattformsversionen i TFM. Om Android-plattformen till exempel har lagt till API-nivå 32-API:er i en .NET 6.0.x SDK-uppdatering kan du komma åt dem med hjälp av TFM net6.0-android32.0
.
När en OS-specifik TFM inte uttryckligen anger plattformsversionen har den ett underförstått värde som kan härledas från bas-TFM och plattformsnamnet. Till exempel är 35.0
standardplattformsversionen för Android i .NET 9 , vilket innebär att det net9.0-android
är en förkortning för den kanoniska netp.0-android35.0
TFM:en. Det kortfattade formuläret är endast avsett att användas i projektfiler och utökas till kanoniskt format av .NET SDK:s MSBuild-mål innan det skickas till andra verktyg, till exempel NuGet.
I följande tabell visas standardversionen av målplattformen (TPV) för varje .NET-version. Om du vill använda de senaste bindningarna använder du standardvärdet (dvs. ange inte en os-version).
.NET-version | Android | Ios | Mac Catalyst | macOS | tvOS | Tizen | Windows |
---|---|---|---|---|---|---|---|
.NET 8 | 34,0 | 17.2 | 17.2 | 14,2 | 17.1 | 10,0 | 7.0 |
.NET 9 | 35.0 | 18,0 | 18,0 | 15,0 | 10,0 | 7.0 |
Från och med .NET 9, när tjänstversioner introducerar stöd för en senare TPV (som alltid har samma huvudversionsnummer som när .NET-versionen ursprungligen släpptes), kommer den tidigaste TPV som stöds för den .NET-versionen att fortsätta att stödjas. För .NET 9 stöds till exempel den tidigaste iOS-versionen, 18.0, även om en tjänstversion lägger till stöd för den senaste versionen av iOS 18.x. Om du behöver använda de tidigaste bindningarna för en .NET-version använder du ett specifikt operativsystemversionsnummer i din TFM.
Anmärkning
På Apple-plattformar (iOS, macOS, tvOS och Mac Catalyst) i .NET 8 och tidigare är standard-TPV den senaste versionen som stöds i den för närvarande installerade arbetsbelastningen. Det innebär att uppdatering av iOS-arbetsbelastningen i .NET 8 till exempel kan resultera i en högre standard-TPV om stöd för en ny version av iOS har lagts till i den arbetsbelastningen. I föregående tabell är standard-TPV-versionen i den första versionen för den angivna .NET-versionen.
Från och med .NET 9 gäller det här speciella beteendet endast för körbara projekt. Standard-TPV för biblioteksprojekt förblir nu samma för hela en större .NET-version, som alla andra plattformar.
Prioritet
Om din app refererar till ett paket som har flera tillgångar för olika TFM:er föredras de tillgångar som ligger närmare versionsnumret. Om din app till exempel riktar sig mot net6.0-ios
och paketet erbjuder tillgångar för net6.0
och net5.0-ios
, används net6.0
tillgångarna. Mer information finns i Prioriteter.
Stöd för äldre os-versioner
Även om en plattformsspecifik app eller ett bibliotek kompileras mot API:er från en viss version av operativsystemet kan du göra den kompatibel med tidigare OS-versioner genom att lägga till egenskapen i SupportedOSPlatformVersion
projektfilen. Egenskapen SupportedOSPlatformVersion
anger den lägsta operativsystemversion som krävs för att köra din app eller ditt bibliotek. Om du inte uttryckligen anger den här lägsta körningsversionen av operativsystemet i projektet, är den standardversion av plattformen från TFM.
För att appen ska kunna köras korrekt på en äldre operativsystemversion kan den inte anropa API:er som inte finns på den versionen av operativsystemet. Du kan dock lägga till vakter runt anrop till nyare API:er så att de bara anropas när de körs på en version av operativsystemet som stöder dem. Med det här mönstret kan du utforma din app eller ditt bibliotek så att det stöder körning på äldre os-versioner samtidigt som du drar nytta av nyare os-funktioner när du kör på nyare os-versioner.
Värdet SupportedOSPlatformVersion
(oavsett om det är explicit eller standard) används av analysverktyget för plattformskompatibilitet, som identifierar och varnar för obevakade anrop till nyare API:er. Den bränns in i projektets kompilerade sammansättning som ett UnsupportedOSPlatformAttribute sammansättningsattribut, så att analysverktyget för plattformskompatibilitet kan identifiera obevakade anrop till sammansättningens API:er från projekt med ett lägre SupportedOSPlatformVersion
värde. På vissa plattformar SupportedOSPlatformVersion
påverkar värdet plattformsspecifika apppaketerings- och byggprocesser, som beskrivs i dokumentationen för dessa plattformar.
Här är ett exempelutdrag av en projektfil som använder TargetFramework
egenskaperna och SupportedOSPlatformVersion
MSBuild för att ange att appen eller biblioteket har åtkomst till iOS 15.0-API:er men stöder körning på iOS 13.0 och senare:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0-ios15.0</TargetFramework>
<SupportedOSPlatformVersion>13.0</SupportedOSPlatformVersion>
</PropertyGroup>
...
</Project>
Så här anger du ett målramverk
Målramverk anges i en projektfil. När ett enda målramverk har angetts använder du targetframework-elementet. Följande konsolappprojektfil visar hur du riktar in dig på .NET 9:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
</PropertyGroup>
</Project>
När du anger flera målramverk kan du villkorligt referera till sammansättningar för varje målramverk. I koden kan du villkorligt kompilera mot dessa sammansättningar med hjälp av preprocessorsymboler med if-then-else-logik .
Följande biblioteksprojekt riktar sig till API:er för .NET Standard (netstandard1.4
) och .NET Framework (net40
och net45
). Använd elementet TargetFrameworks i plural med flera målramverk. Attributen Condition
innehåller implementeringsspecifika paket när biblioteket kompileras för de två .NET Framework TFM:erna:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard1.4;net40;net45</TargetFrameworks>
</PropertyGroup>
<!-- Conditionally obtain references for the .NET Framework 4.0 target -->
<ItemGroup Condition=" '$(TargetFramework)' == 'net40' ">
<Reference Include="System.Net" />
</ItemGroup>
<!-- Conditionally obtain references for the .NET Framework 4.5 target -->
<ItemGroup Condition=" '$(TargetFramework)' == 'net45' ">
<Reference Include="System.Net.Http" />
<Reference Include="System.Threading.Tasks" />
</ItemGroup>
</Project>
I ditt bibliotek eller din app skriver du villkorsstyrd kod med hjälp av förprocessordirektiv för att kompilera för varje målramverk:
public class MyClass
{
static void Main()
{
#if NET40
Console.WriteLine("Target framework: .NET Framework 4.0");
#elif NET45
Console.WriteLine("Target framework: .NET Framework 4.5");
#else
Console.WriteLine("Target framework: .NET Standard 1.4");
#endif
}
}
Symboler för förprocessor
Byggsystemet är medvetet om preprocessorsymboler som representerar målramverken som visas i tabellen Målramverksversioner som stöds när du använder SDK-liknande projekt. Om du vill konvertera en .NET Standard, .NET Core eller .NET 5+ TFM till en preprocessorsymbol ersätter du punkter och bindestreck med ett understreck och ändrar gemener till versaler (till exempel är netstandard1.4
symbolen för NETSTANDARD1_4
).
Du kan inaktivera generering av dessa symboler via egenskapen DisableImplicitFrameworkDefines
. Mer information om den här egenskapen finns i DisableImplicitFrameworkDefines.
Den fullständiga listan över preprocessorsymboler för .NET-målramverk är:
Målramverk | Symboler | Ytterligare symboler (finns i .NET 5+ SDK:er) |
Plattformssymboler (endast tillgängliga när du anger en OS-specifik TFM) |
---|---|---|---|
.NET Framework |
NETFRAMEWORK , NET481 , NET48 , NET472 , NET471 , NET47 , NET462 , NET461 , NET46 , , NET452 , NET451 , NET45 , NET40 , , NET35 NET20 |
NET48_OR_GREATER , NET472_OR_GREATER , NET471_OR_GREATER , NET47_OR_GREATER , NET462_OR_GREATER , NET461_OR_GREATER , NET46_OR_GREATER , NET452_OR_GREATER , , NET451_OR_GREATER , NET45_OR_GREATER , NET40_OR_GREATER , , , NET35_OR_GREATER NET20_OR_GREATER |
|
.NET Standard |
NETSTANDARD , NETSTANDARD2_1 , NETSTANDARD2_0 , NETSTANDARD1_6 , NETSTANDARD1_5 , NETSTANDARD1_4 , , NETSTANDARD1_3 , NETSTANDARD1_2 , , NETSTANDARD1_1 NETSTANDARD1_0 |
NETSTANDARD2_1_OR_GREATER , NETSTANDARD2_0_OR_GREATER , NETSTANDARD1_6_OR_GREATER , NETSTANDARD1_5_OR_GREATER , NETSTANDARD1_4_OR_GREATER , NETSTANDARD1_3_OR_GREATER , , NETSTANDARD1_2_OR_GREATER , , NETSTANDARD1_1_OR_GREATER NETSTANDARD1_0_OR_GREATER |
|
.NET 5+ (och .NET Core) |
NET , NET9_0 , NET8_0 , NET7_0 , NET6_0 , NET5_0 , NETCOREAPP , NETCOREAPP3_1 , , NETCOREAPP3_0 , NETCOREAPP2_2 , NETCOREAPP2_1 , NETCOREAPP2_0 , , NETCOREAPP1_1 NETCOREAPP1_0 |
NET9_0_OR_GREATER , NET8_0_OR_GREATER , NET7_0_OR_GREATER , NET6_0_OR_GREATER , NET5_0_OR_GREATER , NETCOREAPP3_1_OR_GREATER , NETCOREAPP3_0_OR_GREATER , NETCOREAPP2_2_OR_GREATER , , NETCOREAPP2_1_OR_GREATER , NETCOREAPP2_0_OR_GREATER , , , NETCOREAPP1_1_OR_GREATER NETCOREAPP1_0_OR_GREATER |
ANDROID , BROWSER , IOS , MACCATALYST , MACOS , , TVOS , , WINDOWS [OS][version] (till exempel IOS15_1 ),[OS][version]_OR_GREATER (till exempel IOS15_1_OR_GREATER ) |
Anmärkning
- Versionslösa symboler definieras oavsett vilken version du riktar in dig på.
- Versionsspecifika symboler definieras endast för den version som du riktar in dig på.
- Symbolerna
<framework>_OR_GREATER
definieras för den version som du riktar in dig på och alla tidigare versioner. Om du till exempel riktar in dig på .NET Framework 2.0 definieras följande symboler:NET20
,NET20_OR_GREATER
,NET11_OR_GREATER
ochNET10_OR_GREATER
. - Symbolerna
NETSTANDARD<x>_<y>_OR_GREATER
definieras endast för .NET Standard-mål och inte för mål som implementerar .NET Standard, till exempel .NET Core och .NET Framework. - Dessa skiljer sig från målramverksmoniker (TFM) som används av MSBuild-egenskapen och NuGet.
Inaktuella målramverk
Följande målramverk är inaktuella. Paket som riktar sig mot dessa målramverk bör migreras till de angivna ersättningarna.
Inaktuell TFM | Ersättning |
---|---|
aspnet50 aspnetcore50 dnxcore50 Dnx dnx45 dnx451 dnx452 |
netcoreapp |
dotnet dotnet50 dotnet51 dotnet52 dotnet53 dotnet54 dotnet55 dotnet56 |
netstandard |
netcore50 | uap10.0 |
vinna | netcore45 |
Windows 8 | netcore45 |
Windows 8.1 | netcore451 |
Windows 10 | uap10.0 |
winrt | netcore45 |