Nota
L'accés a aquesta pàgina requereix autorització. Podeu provar d'iniciar la sessió o de canviar els directoris.
L'accés a aquesta pàgina requereix autorització. Podeu provar de canviar els directoris.
Cuando se dirige a un marco en una aplicación o biblioteca, debe especificar el conjunto de API que quiere poner a disposición de la aplicación o biblioteca. Se especifica el framework de destino mediante un identificador del framework de destino (TFM) en el archivo del proyecto.
Una aplicación o biblioteca puede tener como destino una versión de .NET Standard. .NET versiones estándar representan conjuntos estandarizados de API en todas las implementaciones de .NET. Por ejemplo, una biblioteca puede tener como destino .NET Standard 1.6 y obtener acceso a las API que funcionan en .NET Core y .NET Framework con el mismo código base.
Una aplicación o biblioteca también puede tener como destino una implementación de .NET específica para obtener acceso a las API específicas de la implementación. Por ejemplo, una aplicación destinada a Plataforma universal de Windows (UWP, uap10.0) tiene acceso a las API que se compilan para dispositivos que ejecutan Windows 10.
Para algunas plataformas de destino, como .NET Framework, las API se definen mediante los ensamblados que el marco instala en un sistema y pueden incluir API de marco de aplicación (por ejemplo, ASP.NET).
En el caso de las plataformas de destino basadas en paquetes (por ejemplo, .NET 5+, .NET Core y .NET Standard), las API se definen mediante los paquetes NuGet incluidos en la aplicación o biblioteca.
Últimas versiones
En la tabla siguiente se definen los marcos de destino más comunes, cómo se hace referencia a ellos y qué versión de .NET Standard implementan. Estas versiones de plataformas de destino son las últimas versiones estables. No se muestran las versiones preliminares. Un target framework moniker (TFM) es un formato de token estandarizado para especificar el marco de destino de una aplicación o biblioteca de .NET.
| Framework objetivo | Más reciente versión estable |
Moniker de la plataforma de destino (TFM) | Implementado .NET versión estándar |
|---|---|---|---|
| .NET 10 | 10 | net10.0 | 2.1 |
| .NET 9 | 9 | net9.0 | 2.1 |
| .NET 8 | 8 | net8.0 | 2.1 |
| .NET Estándar | 2.1 | netstandard2.1 | N/D |
| .NET Core | 3.1 | netcoreapp3.1 | 2.1 |
| .NET Framework | 4.8.1 | net481 | 2.0 |
Plataformas de destino admitidas
Normalmente, un TFM hace referencia a una plataforma de destino. En la tabla siguiente se muestran las plataformas de destino compatibles con el SDK de .NET y el cliente NuGet. Los equivalentes se muestran entre corchetes. Por ejemplo, win81 es un TFM equivalente a netcore451.
| Marco de destino | TFM |
|---|---|
| .NET 5+ (y .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* net10.0* |
| .NET Estándar | 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 |
| teléfono de Windows | wp [wp7] wp7 wp75 wp8 wp81 wpa81 |
| Plataforma universal de Windows | uap [uap10.0] uap10.0 [win10] [netcore50] |
* .NET 5 y versiones posteriores de TFMs incluyen algunas variaciones específicas del sistema operativo. Para obtener más información, consulte la sección siguiente, TFMs específicas del sistema operativo.
TFM específicos para el sistema operativo
Los net8.0, net9.0 y net10.0 TFM incluyen tecnologías que funcionan en distintas plataformas. Al especificar un TFM específico de OS hace que las API específicas de un sistema operativo estén disponibles para tu aplicación, por ejemplo, vínculos de Windows Forms o iOS. Los TFM específicos del sistema operativo también heredan todas las API disponibles para el TFM base, por ejemplo, el TFM net10.0.
En la tabla siguiente se muestra la compatibilidad de los TFMs de .NET 8+.
| TFM | Compatible con |
|---|---|
net8.0 |
(versión posterior de net7.0) |
net8.0-android |
(versión posterior de net7.0-android) |
net8.0-browser |
Todo heredado de net8.0 |
net8.0-ios |
(versión posterior de net7.0-ios) |
net8.0-maccatalyst |
(versión posterior de net7.0-maccatalyst) |
net8.0-macos |
(versión posterior de net7.0-macos) |
net8.0-tizen |
(versión posterior de net7.0-tizen) |
net8.0-tvos |
(versión posterior de net7.0-tvos) |
net8.0-windows |
(versión posterior de net7.0-windows) |
net9.0 |
(versión posterior de net8.0) |
net9.0-android |
(versión posterior de net8.0-android) |
net9.0-browser |
(versión posterior de net8.0-browser) |
net9.0-ios |
(versión posterior de net8.0-ios) |
net9.0-maccatalyst |
(versión posterior de net8.0-maccatalyst) |
net9.0-macos |
(versión posterior de net8.0-macos) |
net9.0-tizen |
(versión posterior de net8.0-tizen) |
net9.0-tvos |
(versión posterior de net8.0-tvos) |
net9.0-windows |
(versión posterior de net8.0-windows) |
net10.0 |
(versión posterior de net9.0) |
net10.0-android |
(versión posterior de net9.0-android) |
net10.0-browser |
(versión posterior de net9.0-browser) |
net10.0-ios |
(versión posterior de net9.0-ios) |
net10.0-maccatalyst |
(versión posterior de net9.0-maccatalyst) |
net10.0-macos |
(versión posterior de net9.0-macos) |
net10.0-tizen |
(versión posterior de net9.0-tizen) |
net10.0-tvos |
(versión posterior de net9.0-tvos) |
net10.0-windows |
(versión posterior de net9.0-windows) |
Para que la aplicación sea portable entre distintas plataformas pero todavía tenga acceso a API específicas del sistema operativo, puede seleccionar como destino varios TFM específicos del sistema operativo y agregar restricciones de plataforma alrededor de llamadas API específicas del sistema operativo mediante directivas de preprocesador #if. Para obtener una lista de los símbolos disponibles, consulte Símbolos de preprocesador.
Destinos sugeridos
Siga estas instrucciones para determinar qué TFM usar en la aplicación:
- Las aplicaciones que se pueden trasladar a varias plataformas deben tener como destino un TFM base, como
net10.0. Esto incluye la mayoría de las bibliotecas, pero también ASP.NET Core y Entity Framework. - Las bibliotecas específicas de la plataforma deben tener como objetivo las variantes específicas de la plataforma. Por ejemplo, los proyectos de WinForms y WPF deben tener como destino
net10.0-windows. - Los modelos de aplicaciones multiplataforma (por ejemplo, ASP.NET Core) deben tener como objetivo al menos el TFM base, por ejemplo,
net10.0, pero también podrían tener como objetivo otros sabores específicos de la plataforma para habilitar más API o características.
Versión del sistema operativo en los TFM
También puede especificar una versión opcional del sistema operativo al final del TFM específico del sistema operativo, por ejemplo, net8.0-ios17.2. La versión indica cuáles son las API que están disponibles para la aplicación o la biblioteca. No controla la versión del sistema operativo que la aplicación o biblioteca admite en tiempo de ejecución. Se usa para seleccionar los ensamblados de referencia en los que se compila el proyecto, y para seleccionar recursos de paquetes NuGet. Piense en esta versión como "versión de plataforma" o "versión de API del sistema operativo" para eliminar la ambigüedad de la versión del sistema operativo en tiempo de ejecución.
El SDK de .NET está diseñado para poder admitir las API recién publicadas para una plataforma individual sin una nueva versión del TFM base. Esto le permite acceder a la funcionalidad específica de la plataforma sin esperar a una versión principal de .NET. Puede obtener acceso a estas API recién publicadas incrementando la versión de la plataforma en el TFM. Por ejemplo, si la plataforma Android agregó APIs de nivel 34 en una actualización del SDK de .NET 8.0.x, puede acceder a ellas con el TFM net8.0-android34.0.
Cuando un TFM específico del sistema operativo no especifica explícitamente la versión de la plataforma, tiene un valor implícito que puede deducirse del TFM base y del nombre de la plataforma. Por ejemplo, la versión predeterminada de la plataforma para Android en .NET 9 es 35.0, lo que significa que net9.0-android es abreviada para el TFM canónico net9.0-android35.0. El formulario abreviado está diseñado solo para su uso en archivos de proyecto y se expande al formato canónico mediante los destinos de MSBuild del SDK de .NET antes de pasarse a otras herramientas, como NuGet.
En la tabla siguiente se muestra la versión predeterminada de la plataforma de destino (TPV) para Android e iOS de cada lanzamiento de .NET. Si desea usar los enlaces más recientes, use el valor predeterminado (es decir, no especifique una versión del sistema operativo).
| versión de .NET | Androide | Ios |
|---|---|---|
| .NET 8 | 34,0 | 17.2 |
| .NET 9 | 35,0 | 18.0 |
| .NET 10 | 36.0 | 18.7 |
A partir de .NET 9, cuando las versiones de servicio presentan compatibilidad con un TPV posterior (que siempre tendrá el mismo major número de versión que cuando se publicó inicialmente la versión de .NET), se seguirá admitiendo el TPV admitido más antiguo para esa versión de .NET. Por ejemplo, para .NET 9, la versión de iOS compatible más antigua, 18.0, seguirá siendo compatible, incluso cuando una versión de servicio agrega compatibilidad con la versión más reciente de iOS 18.x. Si necesita usar los enlaces más antiguos para una versión de .NET, use un número de versión específico del sistema operativo en el TFM.
Nota:
En las plataformas Apple (iOS, macOS, tvOS y Mac Catalyst) en .NET 8 y versiones anteriores, el TPV predeterminado es la versión más reciente compatible en la carga de trabajo instalada actualmente. Esto significa que actualizar la carga de trabajo de iOS en .NET 8, por ejemplo, podría dar lugar a un TPV predeterminado superior, si se ha agregado compatibilidad con una nueva versión de iOS en esa carga de trabajo. En la tabla anterior, el TPV predeterminado es la versión del lanzamiento inicial de la versión .NET indicada.
A partir de .NET 9, este comportamiento especial solo se aplica a los proyectos executable. El TPV predeterminado para los proyectos de biblioteca ahora sigue siendo el mismo para la totalidad de una versión principal de .NET, como todas las demás plataformas.
Prioridad
Si la aplicación hace referencia a un paquete que tiene varios recursos para diferentes TFM, se prefieren los recursos que están más cerca del número de versión. Por ejemplo, si la aplicación tiene como destino net9.0-ios y el paquete ofrece recursos para net9.0 y net8.0-ios, se usan los recursos de net9.0. Para más información, vea Precedencias.
Compatibilidad con versiones del sistema operativo anteriores
Aunque una aplicación o una biblioteca específicas de la plataforma se compilan en las API de una versión específica de ese sistema operativo, puede hacerlas compatibles con versiones anteriores del sistema operativo agregando la propiedad SupportedOSPlatformVersion al archivo del proyecto. La propiedad SupportedOSPlatformVersion indica la versión mínima del sistema operativo necesaria para ejecutar la aplicación o la biblioteca. Si no especifica explícitamente la versión mínima del sistema operativo en tiempo de ejecución en el proyecto, por defecto se utiliza la versión de la plataforma del TFM.
Para que la aplicación se ejecute correctamente en una versión anterior del sistema operativo, no puede llamar a las API que no existen en esa versión del sistema operativo. Sin embargo, puede agregar medidas de protección en torno a las llamadas a las API más recientes para que solo se llamen cuando se ejecuten en una versión del sistema operativo que las admita. Este patrón le permite diseñar la aplicación o la biblioteca para que admitan la ejecución en versiones anteriores del sistema operativo, al tiempo que se aprovechan las ventajas de la funcionalidad más reciente del sistema operativo cuando se ejecuta en versiones más recientes de este.
El valor SupportedOSPlatformVersion (ya sea explícito o predeterminado) lo usa el analizador de compatibilidad de la plataforma, que detecta y advierte sobre las llamadas sin protección a API más recientes. Está incorporado en el ensamblado compilado del proyecto como un atributo de ensamblado UnsupportedOSPlatformAttribute, de modo que el analizador de compatibilidad de la plataforma pueda detectar llamadas desprotegidas a las API de ese ensamblado desde proyectos con un valor inferior de SupportedOSPlatformVersion. En algunas plataformas, el valor SupportedOSPlatformVersion afecta a los procesos de compilación y empaquetado de aplicaciones específicos de la plataforma, que se tratan en la documentación de esas plataformas.
En el ejemplo siguiente se muestra un extracto de un archivo de proyecto que usa las TargetFramework propiedades y SupportedOSPlatformVersion MSBuild para especificar que la aplicación o biblioteca tiene acceso a las API de iOS 15.0, pero admite la ejecución en iOS 13.0 y versiones posteriores:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0-ios15.0</TargetFramework>
<SupportedOSPlatformVersion>13.0</SupportedOSPlatformVersion>
</PropertyGroup>
...
</Project>
Procedimiento para especificar una plataforma de destino
Las plataformas de destino se especifican en un archivo del proyecto. Cuando especifique una única plataforma de destino, use el elemento TargetFramework. El siguiente archivo de proyecto de aplicación de consola muestra cómo dirigirse a .NET 10:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
</Project>
Al especificar varias plataformas de destino, puede hacer referencia condicional a ensamblados para cada marco de destino. En tu código, puedes compilar condicionalmente contra esos ensamblados utilizando símbolos de preprocesador con lógica if-then-else.
El siguiente proyecto de biblioteca tiene como destino las API de .NET Standard (netstandard1.4) y .NET Framework (net40 y net45). Use el elemento TargetFrameworks plural con varias plataformas de destino. Los atributos de Condition incluyen paquetes específicos de implementación cuando la biblioteca se compila para los dos TFMs de .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>
Dentro de su aplicación o biblioteca, puede escribir código condicional mediante directivas de preprocesador para compilar para cada plataforma de destino:
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
}
}
Los valores targetFramework son alias
El valor de la propiedad TargetFramework (por ejemplo, net10.0) es un nombre descriptivo, un alias, que el SDK de .NET traduce en propiedades de moniker canónicas. En concreto, el SDK establece las siguientes propiedades del TargetFramework valor:
-
TargetFrameworkMoniker(por ejemplo,.NETCoreApp,Version=v10.0) -
TargetFrameworkIdentifier(por ejemplo,.NETCoreApp) -
TargetFrameworkVersion(por ejemplo,v10.0) -
TargetPlatformMoniker,TargetPlatformIdentifieryTargetPlatformVersion(cuando el destino es una plataforma específica)
NuGet y el SDK de .NET usan estas propiedades de moniker (no la cadena de TargetFramework) para comprobaciones de compatibilidad de paquetes y lógica de compilación. Esta traducción ya se produce para los TFM específicos del sistema operativo. Por ejemplo, net10.0-windows se traduce en TargetFrameworkMoniker = .NETCoreApp,Version=v10.0 y TargetPlatformMoniker = Windows,Version=7.0.
Dado que el alias es solo un nombre, el TargetFramework valor puede ser cualquier cadena alfanumérica, siempre y cuando las propiedades de moniker correspondientes se establezcan correctamente. El siguiente archivo de proyecto usa un alias personalizado denominado banana y establece explícitamente las propiedades de moniker para que el proyecto compile y restaure para .NET 10.0:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>banana</TargetFramework>
</PropertyGroup>
<PropertyGroup Condition=" '$(TargetFramework)' == 'banana' ">
<TargetFrameworkIdentifier>.NETCoreApp</TargetFrameworkIdentifier>
<TargetFrameworkVersion>v10.0</TargetFrameworkVersion>
<TargetFrameworkMoniker>.NETCoreApp,Version=v10.0</TargetFrameworkMoniker>
</PropertyGroup>
</Project>
Para obtener más información sobre estas propiedades, consulte la referencia de propiedades de MSBuild targetFramework .
Símbolos de preprocesador
El sistema de compilación es consciente de los símbolos de preprocesador que representan las plataformas de destino que se muestran en la tabla Versiones compatibles de las plataformas de destino cuando se usan proyectos de estilo SDK. Para convertir un .NET Estándar, .NET Core o .NET TFM de 5+ en un símbolo de preprocesador, reemplace puntos y guiones por un carácter de subrayado y cambie las letras minúsculas a mayúsculas (por ejemplo, el símbolo de netstandard2.0 es NETSTANDARD2_0).
Puede deshabilitar la generación de estos símbolos mediante la propiedad DisableImplicitFrameworkDefines. Para más información acerca de esta propiedad, consulte DisableImplicitFrameworkDefines.
La lista completa de símbolos de preprocesador para frameworks de destino de .NET es:
| Versiones de .NET Framework de destino | Símbolos | Símbolos adicionales (disponible en SDK de .NET 5 o superior) |
Símbolos de plataforma (solo disponibles cuando se especifica un TFM específico del sistema operativo) |
|---|---|---|---|
| .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 Estándar |
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_GREATERNETSTANDARD1_0_OR_GREATER |
|
| .NET 5+ (y .NET Core) |
NET, NET10_0, 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 |
NET10_0_OR_GREATER, 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] (por ejemplo IOS15_1),[OS][version]_OR_GREATER (por ejemplo, IOS15_1_OR_GREATER) |
Nota:
- Los símbolos sin versión se definen independientemente de la versión a la que apuntas.
- Los símbolos específicos de la versión solo se definen para la versión de destino.
- Los símbolos
<framework>_OR_GREATERse definen para la versión de destino y todas las versiones anteriores. Por ejemplo, si tiene como destino .NET Framework 2.0, se definen los símbolos siguientes:NET20,NET20_OR_GREATER,NET11_OR_GREATERyNET10_OR_GREATER. - Los símbolos de
NETSTANDARD<x>_<y>_OR_GREATERsolo se definen para destinos estándar de .NET y no para destinos que implementan .NET Standard, como .NET Core y .NET Framework. - Son diferentes de los monikers de la plataforma de destino (TFM) que usa la propiedad MSBuild
TargetFrameworky NuGet.
Plataformas de destino en desuso
Las siguientes plataformas de destino están en desuso. Los paquetes que tienen como destino estas plataformas deben migrarse a los reemplazos indicados.
| TFM en desuso | Reemplazo |
|---|---|
| aspnet50 aspnetcore50 dnxcore50 Dnx dnx45 dnx451 dnx452 |
netcoreapp |
| dotnet dotnet50 dotnet51 dotnet52 dotnet53 dotnet54 dotnet55 dotnet56 |
netstandard |
| netcore50 | uap10.0 |
| ganar | netcore45 |
| Windows 8 | netcore45 |
| win81 | netcore451 |
| Windows 10 | uap10.0 |
| winrt | netcore45 |
Vea también
- Nombres de marco de destino en .NET 5
- .NET Standard
- control de versiones de .NET
- Windows 11 información de versión