Frameworks cibles dans les projets de type kit SDK
Quand vous ciblez un framework dans une application ou une bibliothèque, vous spécifiez l’ensemble d’API que vous souhaitez rendre accessibles à l’application ou à la bibliothèque. Vous spécifiez le framework cible dans votre fichier projet avec un moniker de framework cible (TFM, target framework moniker).
Une application ou une bibliothèque peut cibler une version de .NET Standard. Les versions .NET Standard représentent des ensembles d’API standard sur toutes les implémentations de .NET. Par exemple, une bibliothèque peut cibler .NET Standard 1.6 et accéder aux API qui fonctionnent sur .NET Core et .NET Framework en utilisant la même base de code.
Une application ou une bibliothèque peut également cibler une implémentation spécifique de .NET pour accéder aux API spécifiques à l’implémentation. Ainsi, une application qui cible Xamarin.iOS (par exemple, Xamarin.iOS10
) a accès à des wrappers d’API iOS fournis par Xamarin pour iOS 10, ou une application qui cible la plateforme Windows universelle (UWP, uap10.0
) a accès aux API de compilation pour les appareils qui exécutent Windows 10.
Pour certains frameworks cibles (comme .NET Framework), les API sont définies par les assemblys que le framework installe sur un système et peuvent inclure des API de framework d’application (par exemple, ASP.NET).
Pour les frameworks cibles basés sur le package (par exemple, .NET 5 (et versions ultérieures), .NET Core et .NET Standard), les API sont définies par les packages NuGet inclus dans l’application ou la bibliothèque.
Dernières versions
Le tableau ci-dessous définit les frameworks cibles les plus courants, la façon dont ils sont référencés et la version de .NET Standard qu’ils implémentent. Ces versions de framework cible sont les dernières versions stables. Les préversions ne sont pas mentionnées. Un moniker de framework cible est un format de jeton standardisé pour la spécification du framework cible d’une bibliothèque ou d’une application .NET.
Version cible de .NET Framework | Latest Version stable |
Moniker de framework cible | Implémenté Version .NET Standard |
---|---|---|---|
.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/A |
.NET Core | 3.1 | netcoreapp3.1 | 2.1 |
.NET Framework | 4.8.1 | net481 | 2.0 |
Frameworks cibles pris en charge
Un framework cible est généralement référencé par un TFM. Le tableau suivant présente les frameworks cibles pris en charge par le SDK .NET et le client NuGet. Les équivalents sont indiqués entre crochets. Par exemple, win81
est un TFM équivalent de netcore451
.
Framework cible | TFM |
---|---|
.NET 5+ (et .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 |
Plateforme Windows universelle | uap [uap10.0] uap10.0 [win10] [netcore50] |
* Certaines variantes de TFM .NET 5 (et versions ultérieures) sont spécifiques au système d’exploitation. Pour plus d’informations, consultez la section suivante TFM .NET 5 (et versions ultérieures) spécifiques au système d’exploitation.
TFM .NET 5 (et versions ultérieures) spécifiques au système d’exploitation
Les TFM net5.0
, net6.0
, net7.0
et net8.0
incluent des technologies qui fonctionnent sur différentes plateformes. La spécification d’un TFM spécifique au système d’exploitation rend les API spécifiques à un système d’exploitation disponibles pour votre application (liaisons iOS ou Windows Forms, par exemple). Les TFM spécifiques au système d’exploitation héritent également de chaque API disponible pour leur TFM de base, par exemple le TFM net6.0
.
.NET 5 a introduit le TFM spécifique au système d’exploitation net5.0-windows
, qui comprend des liaisons spécifiques à Windows pour les API WinForms, WPF et UWP. .NET 6 et les versions ultérieures ont des TPM spécifiques au système d’exploitation supplémentaires, par exemple net6.0-ios
.
Le tableau suivant montre la compatibilité des TPM .NET 5 (et versions ultérieures).
TFM | Compatible avec |
---|---|
net5.0 | net1..4 (avec avertissement NU1701) netcoreapp1..3.1 (avertissement quand WinForms ou WPF est référencé) netstandard1..2.1 |
net5.0-windows | netcoreapp1..3.1 (et tout ce qui est également hérité de net5.0 ) |
net6.0 | (version qui suit net5.0 ) |
net6.0-android | xamarin.android (et tout ce qui est également hérité de net6.0 ) |
net6.0-ios | Tout ce qui est hérité de net6.0 |
net6.0-maccatalyst | Tout ce qui est hérité de net6.0 |
net6.0-macos | Tout ce qui est hérité de net6.0 |
net6.0-tvos | Tout ce qui est hérité de net6.0 |
net6.0-windows | (version qui suit net5.0-windows ) |
net7.0 | (version qui suit net6.0 ) |
net7.0-android | (version qui suit net6.0-android ) |
net7.0-ios | (version qui suit net6.0-ios ) |
net7.0-maccatalyst | (version qui suit net6.0-maccatalyst ) |
net7.0-macos | (version qui suit net6.0-macos ) |
net7.0-tizen | tizen40 (et tout ce qui est également hérité de net7.0 ) |
net7.0-tvos | (version qui suit net6.0-tvos ) |
net7.0-windows | (version qui suit net6.0-windows ) |
net8.0 | (version qui suit net7.0 ) |
net8.0-android | (version qui suit net7.0-android ) |
net8.0-browser | Tout ce qui est hérité de net8.0 |
net8.0-ios | (version qui suit net7.0-ios ) |
net8.0-maccatalyst | (version qui suit net7.0-maccatalyst ) |
net8.0-macos | (version qui suit net7.0-macos ) |
net8.0-tizen | (version qui suit net7.0-tizen ) |
net8.0-tvos | (version qui suit net7.0-tvos ) |
net8.0-windows | (version qui suit net7.0-windows ) |
Pour rendre votre application portable entre différentes plateformes tout en gardant l’accès à des API spécifiques au système d’exploitation, vous pouvez cibler plusieurs TFM spécifiques au système d’exploitation et ajouter des protections de plateforme aux appels d’API spécifiques au système d’exploitation en utilisant des directives de préprocesseur #if
. Pour obtenir la liste des symboles disponibles, consultez Symboles de préprocesseur.
Cibles suggérées
Utilisez ces instructions pour déterminer le TFM à utiliser dans votre application :
Les applications portables sur plusieurs plateformes doivent cibler un TFM de base, par exemple
net8.0
. Ceci inclut la plupart des bibliothèques ainsi qu’ASP.NET Core et Entity Framework.Les bibliothèques spécifiques à la plateforme doivent cibler des saveurs spécifiques à la plateforme. Par exemple, les projets WinForms et WPF doivent cibler
net8.0-windows
.Les packs de pont (Xamarin Essentials) et les modèles d’application multiplateformes (Xamarin Forms, ASP.NET Core) doivent cibler au moins le TFM de base (par exemple,
net8.0
), mais peuvent également cibler d’autres saveurs spécifiques à la plateforme pour activer davantage d’API ou de fonctionnalités.
Version de système d’exploitation dans les TFM
Si vous le souhaitez, vous pouvez également spécifier une version de système d’exploitation à la fin d’un TFM spécifique au système d’exploitation, par exemple net6.0-ios15.0
. La version indique les API disponibles pour votre application ou bibliothèque. Il ne contrôle pas à l’exécution la version du système d’exploitation prise en charge par votre application ou votre bibliothèque. Elle est utilisée pour le choix des assemblys de référence avec lesquels votre projet est compilé et des ressources issues des packages NuGet. Considérez cette version comme la « version de plateforme » ou « version d’API de système d’exploitation » pour la différencier de la version de système d’exploitation à l’exécution.
Quand un TFM spécifique au système d’exploitation ne spécifie pas explicitement la version de plateforme, il a une valeur implicite qui peut être déduite du nom de la plateforme et du TFM de base. Par exemple, la valeur par défaut de la plateforme pour Android dans .NET 6 est 31.0
, ce qui signifie que net6.0-android
est une abréviation pour le TFM canonique net6.0-android31.0
. La version de plateforme implicite d’un TFM de base plus récent peut être supérieure. Par exemple, un futur TFM net8.0-android
pourra correspondre à net8.0-android34.0
. La forme raccourcie est destinée à être utilisée uniquement dans les fichiers projet et est développée en forme canonique par les cibles MSBuild du SDK .NET avant d’être transférée à d’autres outils tels que NuGet.
Le tableau suivant montre les valeurs des plateformes cibles par défaut pour chaque version de .NET.
Version de .NET | 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 |
Remarque
Sur les plateformes Apple (iOS, macOS, tvOS et Mac Catalyst) dans .NET 8 et les versions antérieures, la valeur par défaut de la version cible de la plateforme (TPV) est la dernière version prise en charge dans la charge de travail actuellement installée. Cela signifie que la mise à jour de la charge de travail iOS dans .NET 8, par exemple, peut entraîner une valeur TPV par défaut plus élevée, si la prise en charge d'une nouvelle version d'iOS a été ajoutée dans cette charge de travail. Dans le tableau précédent, la TPV par défaut est celle de la version initiale pour la version .NET indiquée.
À partir de .NET 9, ce comportement spécial ne s'applique qu'aux projets exécutables. La TPV par défaut pour les projets de bibliothèque reste désormais la même pour toute la durée de vie d'une version majeure de .NET, comme sur toutes les autres plateformes.
Le SDK .NET est conçu pour prendre en charge les API récemment publiées pour une plateforme individuelle sans nouvelle version du TFM de base. Ceci vous permet d’accéder à des fonctionnalités spécifiques à la plateforme sans attendre une version majeure de .NET. Vous pouvez accéder à ces API récemment publiées en incrémentant la version de plateforme dans le TFM. Par exemple, si la plateforme Android ajoutait des API du niveau 32 dans une mise à jour du SDK .NET 6.0.x, vous pourriez y accéder en utilisant le TFM net6.0-android32.0
.
Priorité
Si votre application fait référence à un package qui a plusieurs ressources pour différentes TFMs, les ressources plus proches dans le numéro de version sont préférées. Par exemple, si votre application cible net6.0-ios
et que le package propose des ressources pour net6.0
et net5.0-ios
, les ressources net6.0
sont utilisées. Pour obtenir plus d’informations, consultez Priorités.
Prise en charge de versions de système d’exploitation antérieures
Bien qu’une application ou une bibliothèque spécifique à la plateforme soit compilée avec des API d’une version spécifique de ce système d’exploitation, vous pouvez la rendre compatible avec des versions antérieures du système d’exploitation en ajoutant la propriété SupportedOSPlatformVersion
à votre fichier projet. La propriété SupportedOSPlatformVersion
indique la version minimale du système d’exploitation requise pour exécuter votre application ou bibliothèque. Si vous ne spécifiez pas explicitement cette version minimale du système d’exploitation à l’exécution dans le projet, la version de plateforme du TFM est utilisée par défaut.
Pour que votre application s’exécute correctement sur une version antérieure du système d’exploitation, tout appel à des API qui n’existent pas sur cette version du système d’exploitation est impossible. Toutefois, vous pouvez ajouter des protections aux appels à des API plus récentes pour qu’elles soient appelées uniquement en cas d’exécution sur une version du système d’exploitation qui les prend en charge. Ce modèle vous permet de concevoir votre application ou bibliothèque pour qu’elle prenne en charge une exécution sur des versions antérieures du système d’exploitation tout en tirant parti des fonctionnalités du système d’exploitation plus récent en cas d’exécution sur des versions plus récentes du système d’exploitation.
La valeur SupportedOSPlatformVersion
(explicite ou par défaut) est utilisée par l’analyseur de compatibilité de plateforme, qui détecte les appels non protégés aux API plus récentes et les signale. Elle est inscrite dans l’assembly compilé du projet comme attribut d’assembly UnsupportedOSPlatformAttribute pour que l’analyseur de compatibilité de plateforme puisse détecter les appels non protégés aux API de cet assembly à partir de projets avec une valeur SupportedOSPlatformVersion
inférieure. Sur certaines plateformes, la valeur SupportedOSPlatformVersion
affecte les processus d’empaquetage et de génération d’applications spécifiques à la plateforme, ce qui est décrit dans la documentation de ces plateformes.
Voici un exemple d’extrait de fichier projet qui utilise les propriétés MSBuild TargetFramework
et SupportedOSPlatformVersion
pour spécifier que l’application ou la bibliothèque a accès aux API iOS 15.0, mais prend en charge une exécution sur iOS 13.0 (et versions ultérieures) :
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0-ios15.0</TargetFramework>
<SupportedOSPlatformVersion>13.0</SupportedOSPlatformVersion>
</PropertyGroup>
...
</Project>
Comment spécifier un framework cible
Les frameworks cibles sont spécifiés dans un fichier projet. Quand vous spécifiez un seul framework cible, utilisez l’élément TargetFramework. Le fichier projet d’application console suivant montre comment cibler .NET 8 :
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
</Project>
Quand vous spécifiez plusieurs frameworks cibles, vous pouvez référencer conditionnellement des assemblys pour chaque framework cible. Dans votre code, vous pouvez effectuer une compilation conditionnelle par rapport à ces assemblys en utilisant des symboles de préprocesseur avec une logique if-then-else.
Le projet de bibliothèque suivant cible des API de .NET Standard (netstandard1.4
) et de .NET Framework (net40
et net45
). Utilisez l’élément pluriel TargetFrameworks avec plusieurs frameworks cibles. Les attributs Condition
incluent des packages spécifiques à l’implémentation quand la bibliothèque est compilée pour les deux TFM .NET Framework :
<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>
Au sein de votre application ou bibliothèque, vous écrivez du code conditionnel avec des directives de préprocesseur à compiler pour chaque framework cible :
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
}
}
Symboles de préprocesseur
Le système de génération tient compte des symboles de préprocesseur qui représentent les frameworks cibles indiqués dans le tableau Versions de framework cible prises en charge quand vous utilisez des projets de type SDK. Pour convertir un TFM .NET Standard, .NET Core ou .NET 5 (ou version ultérieure) en symbole de préprocesseur, remplacez les points et les traits d’union par un trait de soulignement et remplacez les lettres minuscules par des majuscules (par exemple, le symbole de netstandard1.4
est NETSTANDARD1_4
).
Vous pouvez désactiver la génération de ces symboles avec la propriété DisableImplicitFrameworkDefines
. Pour plus d’informations sur cette propriété, consultez DisableImplicitFrameworkDefines.
Voici la liste complète des symboles de préprocesseur pour les frameworks cibles .NET :
Versions cibles de .NET Framework | symboles | Symboles supplémentaires (disponibles dans les SDK .NET 5+) |
Symboles de plateforme (disponibles uniquement lorsque vous spécifiez un moniker de framework cible spécifique au système d’exploitation) |
---|---|---|---|
.NET Framework | NETFRAMEWORK , 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+ (et .NET Core) | NET , NET8_0 , NET7_0 , NET6_0 , NET5_0 , NETCOREAPP , NETCOREAPP3_1 , NETCOREAPP3_0 , NETCOREAPP2_2 , NETCOREAPP2_1 , NETCOREAPP2_0 , NETCOREAPP1_1 , 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_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] (par exemple, IOS15_1 ),[OS][version]_OR_GREATER (par exemple IOS15_1_OR_GREATER ) |
Notes
- Les symboles sans version sont définis indépendamment de la version que vous ciblez.
- Les symboles spécifiques à la version sont définis uniquement pour la version que vous ciblez.
- Les symboles
<framework>_OR_GREATER
sont définis pour la version que vous ciblez et toutes les versions antérieures. Par exemple, si vous ciblez .NET Framework 2.0, les symboles suivants sont définis :NET20
,NET20_OR_GREATER
,NET11_OR_GREATER
etNET10_OR_GREATER
. - Les symboles
NETSTANDARD<x>_<y>_OR_GREATER
sont définis uniquement pour les cibles .NET Standard, et non pour les cibles qui implémentent .NET Standard, telles que .NET Core et .NET Framework. - Ils sont différents des monikers de framework cible utilisés par la propriété MSBuild
TargetFramework
et NuGet.
Frameworks cibles dépréciés
Les frameworks cibles suivants sont dépréciés. Les packages qui ciblent ces frameworks cibles doivent migrer vers les versions de remplacement indiquées.
TFM déprécié | Remplacement |
---|---|
aspnet50 aspnetcore50 dnxcore50 dnx dnx45 dnx451 dnx452 |
netcoreapp |
dotnet dotnet50 dotnet51 dotnet52 dotnet53 dotnet54 dotnet55 dotnet56 |
netstandard |
netcore50 | uap10.0 |
win | netcore45 |
win8 | netcore45 |
win81 | netcore451 |
win10 | uap10.0 |
winrt | netcore45 |
Voir aussi
- Noms des frameworks cibles dans .NET 5
- Appeler des API Windows Runtime dans les applications de bureau
- Développer des bibliothèques avec des outils multiplateformes
- .NET Standard
- Gestion des versions de .NET Core
- NuGet Tools GitHub Repository (Dépôt GitHub des outils NuGet)
- Framework Profiles in .NET (Profils de framework dans .NET)
- Analyseur de compatibilité de plateforme