Doelframeworks in SDK-projecten
Wanneer u een framework in een app of bibliotheek richt, geeft u de set API's op die u beschikbaar wilt maken voor de app of bibliotheek. U geeft het doelframework in uw projectbestand op met behulp van een target framework moniker (TFM).
Een app of bibliotheek kan zich richten op een versie van .NET Standard. .NET Standard-versies vertegenwoordigen gestandaardiseerde sets API's voor alle .NET-implementaties. Een bibliotheek kan zich bijvoorbeeld richten op .NET Standard 1.6 en toegang krijgen tot API's die werken in .NET Core en .NET Framework met behulp van dezelfde codebase.
Een app of bibliotheek kan ook gericht zijn op een specifieke .NET-implementatie om toegang te krijgen tot implementatiespecifieke API's. Een app die bijvoorbeeld is gericht op Xamarin.iOS (bijvoorbeeldXamarin.iOS10
) heeft toegang tot door Xamarin geleverde iOS API-wrappers voor iOS 10 of een app die is gericht op Universeel Windows-platform (UWP, uap10.0
) heeft toegang tot API's die worden gecompileerd voor apparaten met Windows 10.
Voor sommige doelframeworks, zoals .NET Framework, worden de API's gedefinieerd door de assembly's die het framework op een systeem installeert en kunnen toepassingsframework-API's (bijvoorbeeld ASP.NET) bevatten.
Voor op pakketten gebaseerde doelframeworks (bijvoorbeeld .NET 5+, .NET Core en .NET Standard) worden de API's gedefinieerd door de NuGet-pakketten die zijn opgenomen in de app of bibliotheek.
Nieuwste versies
In de volgende tabel worden de meest voorkomende doelframeworks gedefinieerd, hoe ernaar wordt verwezen en naar welke versie van .NET Standard ze worden geïmplementeerd. Deze doelframeworkversies zijn de nieuwste stabiele versies. Voorlopige versies worden niet weergegeven. Een doelframework moniker (TFM) is een gestandaardiseerde tokenindeling voor het opgeven van het doelframework van een .NET-app of -bibliotheek.
Doelframework | Laatst stabiele versie |
Moniker van het doelframework (TFM) | Implemented .NET Standard-versie |
---|---|---|---|
.NET 8 | 8 | net8.0 | 2.1 |
.NET 7 | 7 | net7.0 | 2.1 |
.NET 6 | 6 | net6.0 | 2.1 |
.NET 5 | 5 | net5.0 | 2.1 |
.NET Standard | 2.1 | netstandard2.1 | N.v.t. |
.NET Core | 3.1 | netcoreapp3.1 | 2.1 |
.NET Framework | 4.8.1 | net481 | 2.0 |
Ondersteunde doelframeworks
Naar een doelframework wordt doorgaans verwezen door een TFM. In de volgende tabel ziet u de doelframeworks die worden ondersteund door de .NET SDK en de NuGet-client. Equivalenten worden tussen vierkante haken weergegeven. Is bijvoorbeeld win81
een equivalent van TFM aan netcore451
.
Doelframework | TFM |
---|---|
.NET 5+ (en .NET Core) | netcoreapp1.0 netcoreapp1.1 netcoreapp2.0 netcoreapp2.1 netcoreapp2.2 netcoreapp3.0 netcoreapp3.1 net5.0* net6.0* net7.0* net8.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 Micro Framework | netmf |
Silverlight | sl4 sl5 |
Windows Phone | wp [wp7] wp7 wp75 wp8 wp81 wpa81 |
Universeel Windows-platform | uap [uap10.0] uap10.0 [win10] [netcore50] |
* TFM's voor .NET 5 en hoger bevatten enkele besturingssysteemspecifieke variaties. Zie de volgende sectie, .NET 5+ OS-specifieke TFM's voor meer informatie.
.NET 5+ BEsturingssysteemspecifieke TFM's
De net5.0
, net6.0
en net7.0
net8.0
TFM's bevatten technologieën die op verschillende platforms werken. Als u een besturingssysteemspecifieke TFM opgeeft, worden API's die specifiek zijn voor een besturingssysteem beschikbaar voor uw app, bijvoorbeeld Windows Forms of iOS-bindingen. Besturingssysteemspecifieke TFM's nemen ook elke API over die beschikbaar is voor hun basis TFM, bijvoorbeeld de net6.0
TFM.
.NET 5 heeft het net5.0-windows
besturingssysteemspecifieke TFM geïntroduceerd, waaronder Windows-specifieke bindingen voor WinForms, WPF en UWP-API's. .NET 6 en nieuwere versies hebben extra besturingssysteemspecifieke TFM's, net6.0-ios
bijvoorbeeld.
In de volgende tabel ziet u de compatibiliteit van de .NET 5+ TFM's.
TFM | Compatibel met |
---|---|
net5.0 | net1.. 4 (met NU1701-waarschuwing) netcoreapp1.. 3.1 (waarschuwing wanneer naar WinForms of WPF wordt verwezen) netstandard1.. 2.1 |
net5.0-windows | netcoreapp1.. 3.1 (plus alle andere overgenomen van net5.0 ) |
net6.0 | (Volgende versie van net5.0 ) |
net6.0-android | xamarin.android (plus alle overige overgenomen van net6.0 ) |
net6.0-ios | Alles overgenomen van net6.0 |
net6.0-maccatalyst | Alles overgenomen van net6.0 |
net6.0-macos | Alles overgenomen van net6.0 |
net6.0-tvos | Alles overgenomen van net6.0 |
net6.0-windows | (Volgende versie van net5.0-windows ) |
net7.0 | (Volgende versie van net6.0 ) |
net7.0-android | (Volgende versie van net6.0-android ) |
net7.0-ios | (Volgende versie van net6.0-ios ) |
net7.0-maccatalyst | (Volgende versie van net6.0-maccatalyst ) |
net7.0-macos | (Volgende versie van net6.0-macos ) |
net7.0-tizen | tizen40 (plus alle overige overgenomen van net7.0 ) |
net7.0-tvos | (Volgende versie van net6.0-tvos ) |
net7.0-windows | (Volgende versie van net6.0-windows ) |
net8.0 | (Volgende versie van net7.0 ) |
net8.0-android | (Volgende versie van net7.0-android ) |
net8.0-browser | Alles overgenomen van net8.0 |
net8.0-ios | (Volgende versie van net7.0-ios ) |
net8.0-maccatalyst | (Volgende versie van net7.0-maccatalyst ) |
net8.0-macos | (Volgende versie van net7.0-macos ) |
net8.0-tizen | (Volgende versie van net7.0-tizen ) |
net8.0-tvos | (Volgende versie van net7.0-tvos ) |
net8.0-windows | (Volgende versie van net7.0-windows ) |
Als u uw app overdraagbaar wilt maken op verschillende platforms, maar nog steeds toegang hebt tot besturingssysteemspecifieke API's, kunt u zich richten op meerdere BEsturingssysteemspecifieke TFM's en platformbeveiligingen toevoegen rond OS-specifieke API-aanroepen met behulp van #if
preprocessorrichtlijnen. Zie Preprocessorsymbolen voor een lijst met de beschikbare symbolen.
Voorgestelde doelen
Gebruik deze richtlijnen om te bepalen welke TFM in uw app moet worden gebruikt:
Apps die overdraagbaar zijn naar meerdere platforms, moeten bijvoorbeeld
net8.0
gericht zijn op een basis TFM. Dit omvat de meeste bibliotheken, maar ook ASP.NET Core en Entity Framework.Platformspecifieke bibliotheken moeten gericht zijn op platformspecifieke smaken. WinForms- en WPF-projecten moeten zich bijvoorbeeld richten op
net8.0-windows
.Platformoverschrijdende toepassingsmodellen (Xamarin Forms, ASP.NET Core) en bridge packs (Xamarin Essentials) moeten ten minste gericht zijn op de basis TFM,
net8.0
maar kunnen ook gericht zijn op extra platformspecifieke smaken om meer API's of functies op te lichten.
Besturingssysteemversie in TFM's
U kunt ook een optionele versie van het besturingssysteem opgeven aan het einde van een besturingssysteemspecifieke TFM, bijvoorbeeld net6.0-ios15.0
. De versie geeft aan welke API's beschikbaar zijn voor uw app of bibliotheek. Het besturingssysteem heeft geen controle over de versie van het besturingssysteem die tijdens runtime door uw app of bibliotheek wordt ondersteund. Het wordt gebruikt om de referentieassembly's te selecteren waarmee uw project wordt gecompileerd en om assets te selecteren uit NuGet-pakketten. U kunt deze versie beschouwen als de 'platformversie' of 'OS API-versie' om deze te onderscheiden van de runtimeversie van het besturingssysteem.
Wanneer een besturingssysteemspecifieke TFM niet expliciet de platformversie opgeeft, heeft deze een impliciete waarde die kan worden afgeleid van de basis-TFM- en platformnaam. De standaardplatformwaarde voor Android in .NET 6 is 31.0
bijvoorbeeld, wat betekent dat dit net6.0-android
afkorting is voor de canonieke net6.0-android31.0
TFM. De impliciete platformversie voor een nieuwere basis TFM kan hoger zijn, bijvoorbeeld een toekomstige net8.0-android
TFM kan worden toegewezen aan net8.0-android34.0
. Het verkorte formulier is alleen bedoeld voor gebruik in projectbestanden en wordt uitgebreid naar de canonieke vorm door de MSBuild-doelen van de .NET SDK voordat ze worden doorgegeven aan andere hulpprogramma's, zoals NuGet.
In de volgende tabel ziet u de standaardwaarden van het doelplatform (TPV) voor elke .NET-release.
.NET-versie | Android | iOS | Mac Catalyst | macOS | tvOS | Tizen | Windows |
---|---|---|---|---|---|---|---|
.NET 6 | 31.0 | 15.0 | 15.0 | 12.0 | 15.1 | - | 7.0 |
.NET 7 | 33.0 | 16.1 | 16.1 | 13,0 | 16.1 | 7.0 | 7.0 |
.NET 8 | 34.0 | 17.2 | 17.2 | 14,2 | 17.1 | 8.0 | 7.0 |
Notitie
Op Apple-platforms (iOS, macOS, tvOS en Mac Catalyst) in .NET 8 en eerder is de standaard-TPV de meest recente ondersteunde versie in de momenteel geïnstalleerde workload. Dit betekent dat het bijwerken van de iOS-workload in .NET 8 bijvoorbeeld kan leiden tot een hogere standaard-TPV als ondersteuning voor een nieuwe versie van iOS is toegevoegd in die workload. In de voorgaande tabel is de standaard-NHW de standaard-TPV in de eerste release voor de vermelde .NET-versie.
Vanaf .NET 9 is dit speciale gedrag alleen van toepassing op uitvoerbare projecten. De standaard-TPV voor bibliotheekprojecten blijft nu hetzelfde voor de gehele primaire .NET-release, net als alle andere platforms.
De .NET SDK is ontworpen om nieuw uitgebrachte API's te kunnen ondersteunen voor een afzonderlijk platform zonder een nieuwe versie van de basis TFM. Hierdoor hebt u toegang tot platformspecifieke functionaliteit zonder te wachten op een grote release van .NET. U kunt toegang krijgen tot deze nieuw uitgebrachte API's door de platformversie in tfm te verhogen. Als het Android-platform bijvoorbeeld API-niveau 32 API's heeft toegevoegd in een SDK-update van .NET 6.0.x, kunt u deze openen met behulp van de TFM net6.0-android32.0
.
Prioriteit
Als uw app verwijst naar een pakket met meerdere assets voor verschillende TFM's, hebben de assets die dichter bij het versienummer staan de voorkeur. Als uw app-doelen net6.0-ios
en het pakket bijvoorbeeld assets biedt voor net6.0
en net5.0-ios
, worden de net6.0
assets gebruikt. Zie Prioriteiten voor meer informatie.
Oudere besturingssysteemversies ondersteunen
Hoewel een platformspecifieke app of bibliotheek wordt gecompileerd op API's van een specifieke versie van dat besturingssysteem, kunt u deze compatibel maken met eerdere versies van het besturingssysteem door de SupportedOSPlatformVersion
eigenschap toe te voegen aan uw projectbestand. De SupportedOSPlatformVersion
eigenschap geeft de minimale versie van het besturingssysteem aan die is vereist om uw app of bibliotheek uit te voeren. Als u deze minimale runtimebesturingssysteemversie niet expliciet opgeeft in het project, wordt deze standaard ingesteld op de platformversie van tfm.
Uw app kan alleen correct worden uitgevoerd op een oudere versie van het besturingssysteem, maar kan geen API's aanroepen die niet bestaan in die versie van het besturingssysteem. U kunt echter bewakers toevoegen rond aanroepen naar nieuwere API's, zodat ze alleen worden aangeroepen wanneer ze worden uitgevoerd op een versie van het besturingssysteem die deze ondersteunt. Met dit patroon kunt u uw app of bibliotheek ontwerpen om ondersteuning te bieden voor oudere versies van het besturingssysteem, terwijl u profiteert van nieuwere besturingssysteemfunctionaliteit bij het uitvoeren van nieuwere versies van het besturingssysteem.
De SupportedOSPlatformVersion
waarde (expliciet of standaard) wordt gebruikt door de platformcompatibiliteitsanalyse, waarmee niet-beveiligde aanroepen naar nieuwere API's worden gedetecteerd en gewaarschuwd. Deze wordt in de gecompileerde assembly van het project verbrand als een UnsupportedOSPlatformAttribute assemblykenmerk, zodat de platformcompatibiliteitsanalyse niet-bewaakte aanroepen van de API's van die assembly kan detecteren uit projecten met een lagere SupportedOSPlatformVersion
waarde. Op sommige platforms is de SupportedOSPlatformVersion
waarde van invloed op platformspecifieke processen voor het verpakken en bouwen van apps, die worden behandeld in de documentatie voor deze platforms.
Hier volgt een voorbeeldfragment van een projectbestand dat gebruikmaakt van de TargetFramework
eigenschappen en SupportedOSPlatformVersion
MSBuild om op te geven dat de app of bibliotheek toegang heeft tot iOS 15.0-API's, maar ondersteuning biedt voor uitvoering op iOS 13.0 en hoger:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0-ios15.0</TargetFramework>
<SupportedOSPlatformVersion>13.0</SupportedOSPlatformVersion>
</PropertyGroup>
...
</Project>
Een doelframework opgeven
Doelframeworks worden opgegeven in een projectbestand. Wanneer er één doelframework is opgegeven, gebruikt u het TargetFramework-element. In het volgende console-app-projectbestand ziet u hoe u .NET 8 kunt targeten:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
</Project>
Wanneer u meerdere doelframeworks opgeeft, kunt u voorwaardelijk verwijzen naar assembly's voor elk doelframework. In uw code kunt u voorwaardelijk compileren op basis van deze assembly's met behulp van preprocessorsymbolen met if-then-else-logica .
Het volgende bibliotheekproject is gericht op API's van .NET Standard (netstandard1.4
) en .NET Framework (net40
en net45
). Gebruik het meervouds TargetFrameworks-element met meerdere doelframeworks. De Condition
kenmerken omvatten implementatiespecifieke pakketten wanneer de bibliotheek wordt gecompileerd voor de twee .NET Framework TFM's:
<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>
In uw bibliotheek of app schrijft u voorwaardelijke code met behulp van preprocessorrichtlijnen om te compileren voor elk doelframework:
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
}
}
Preprocessorsymbolen
Het buildsysteem is op de hoogte van preprocessorsymbolen die de doelframeworks vertegenwoordigen die worden weergegeven in de tabel Ondersteunde doelframeworkversies wanneer u SDK-projecten gebruikt. Als u een .NET Standard-, .NET Core- of .NET 5+ TFM wilt converteren naar een preprocessorsymbool, vervangt u puntjes en afbreekstreepjes door een onderstrepingsteken en wijzigt u kleine letters in hoofdletters (bijvoorbeeld het symbool hiervoornetstandard1.4
).NETSTANDARD1_4
U kunt het genereren van deze symbolen uitschakelen via de DisableImplicitFrameworkDefines
eigenschap. Zie DisableImplicitFrameworkDefines voor meer informatie over deze eigenschap.
De volledige lijst met preprocessorsymbolen voor .NET-doelframeworks is:
Doelframeworks | Symbolen | Aanvullende symbolen (beschikbaar in .NET 5+ SDK's) |
Platformsymbolen (alleen beschikbaar) wanneer u een besturingssysteemspecifieke TFM opgeeft) |
---|---|---|---|
.NET Framework | NETFRAMEWORK , , NET472 NET48 , NET471 , , NET47 , , NET462 NET461 , NET46 , NET451 NET452 NET45 NET40 NET35 ,NET20 |
NET48_OR_GREATER , , NET472_OR_GREATER , , , , NET461_OR_GREATER , NET46_OR_GREATER , NET452_OR_GREATER , NET45_OR_GREATER NET40_OR_GREATER NET35_OR_GREATER NET451_OR_GREATER NET462_OR_GREATER NET47_OR_GREATER NET471_OR_GREATER NET20_OR_GREATER |
|
.NET Standard | NETSTANDARD , , NETSTANDARD2_0 , NETSTANDARD1_6 NETSTANDARD2_1 , , NETSTANDARD1_5 , NETSTANDARD1_4 , , NETSTANDARD1_1 NETSTANDARD1_2 NETSTANDARD1_3 NETSTANDARD1_0 |
NETSTANDARD2_1_OR_GREATER , , NETSTANDARD1_6_OR_GREATER NETSTANDARD2_0_OR_GREATER , NETSTANDARD1_5_OR_GREATER , , NETSTANDARD1_4_OR_GREATER , NETSTANDARD1_3_OR_GREATER , NETSTANDARD1_1_OR_GREATER NETSTANDARD1_2_OR_GREATER NETSTANDARD1_0_OR_GREATER |
|
.NET 5+ (en .NET Core) | NET , , NET8_0 , , , , NETCOREAPP , NETCOREAPP3_1 , NETCOREAPP3_0 , NETCOREAPP2_1 NETCOREAPP2_0 NETCOREAPP1_1 NETCOREAPP2_2 NET5_0 NET6_0 NET7_0 NETCOREAPP1_0 |
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_0_OR_GREATER NETCOREAPP2_1_OR_GREATER NETCOREAPP1_1_OR_GREATER NETCOREAPP2_2_OR_GREATER NETCOREAPP1_0_OR_GREATER |
ANDROID , , BROWSER IOS , MACCATALYST , , MACOS , , TVOS WINDOWS [OS][version] (bijvoorbeeld IOS15_1 ),[OS][version]_OR_GREATER (bijvoorbeeld IOS15_1_OR_GREATER ) |
Notitie
- Versieloze symbolen worden gedefinieerd, ongeacht de versie die u wilt gebruiken.
- Versiespecifieke symbolen worden alleen gedefinieerd voor de versie waarop u zich richt.
- De
<framework>_OR_GREATER
symbolen worden gedefinieerd voor de versie waarop u zich richt en alle eerdere versies. Als u zich bijvoorbeeld richt op .NET Framework 2.0, worden de volgende symbolen gedefinieerd:NET20
,NET20_OR_GREATER
,NET11_OR_GREATER
enNET10_OR_GREATER
. - De
NETSTANDARD<x>_<y>_OR_GREATER
symbolen worden alleen gedefinieerd voor .NET Standard-doelen en niet voor doelen die .NET Standard implementeren, zoals .NET Core en .NET Framework. - Deze verschillen van de doelframework monikers (TFM's) die worden gebruikt door de eigenschap MSBuild
TargetFramework
en NuGet.
Afgeschafte doelframeworks
De volgende doelframeworks zijn afgeschaft. Pakketten die gericht zijn op deze doelframeworks, moeten worden gemigreerd naar de aangegeven vervangingen.
Afgeschafte TFM | Vervanging |
---|---|
aspnet50 aspnetcore50 dnxcore50 dnx dnx45 dnx451 dnx452 |
netcoreapp |
dotnet dotnet50 dotnet51 dotnet52 dotnet53 dotnet54 dotnet55 dotnet56 |
netstandard |
netcore50 | uap10.0 |
winnen | netcore45 |
win8 | netcore45 |
win81 | netcore451 |
win10 | uap10.0 |
winrt | netcore45 |