Comparteix a través de


Plataformas de destino en proyectos de estilo SDK

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, TargetPlatformIdentifiery TargetPlatformVersion (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_GREATER se 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_GREATER y NET10_OR_GREATER.
  • Los símbolos de NETSTANDARD<x>_<y>_OR_GREATER solo 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 MSBuildTargetFramework y 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