Configuración de varios destinos

Las aplicaciones de interfaz de usuario de aplicaciones multiplataforma (.NET MAUI) de .NET usan varios destinos para tener como destino varias plataformas desde un solo proyecto.

El proyecto de una aplicación MAUI de .NET contiene una carpeta Platforms , con cada carpeta secundaria que representa una plataforma que .NET MAUI puede tener como destino:

Captura de pantalla de carpetas de plataforma.

Las carpetas de cada plataforma de destino contienen código específico de la plataforma que inicia la aplicación en cada plataforma, además de cualquier código de plataforma adicional que agregue. En tiempo de compilación, el sistema de compilación solo incluye el código de cada carpeta al compilar para esa plataforma específica. Por ejemplo, al compilar para Android, los archivos de la carpeta Plataformas>Android se integrarán en el paquete de la aplicación, pero los archivos de las demás carpetas Plataformas no serán.

Además de este enfoque predeterminado de múltiples destinos, las aplicaciones de .NET MAUI también pueden tener varios destinos en función de sus propios criterios de nombre de archivo y carpeta. Esto le permite estructurar el proyecto de aplicación MAUI de .NET para que no tenga que colocar el código de la plataforma en subcarpetas de la carpeta Plataformas .

Configuración de varios destinos basados en nombre de archivo

Un patrón estándar de múltiples destinos es incluir la plataforma como una extensión en el nombre de archivo para el código de la plataforma. Por ejemplo, MyService.Android.cs representaría una implementación específica de Android de la MyService clase . El sistema de compilación se puede configurar para usar este patrón agregando el siguiente CÓDIGO XML al archivo del proyecto de aplicación MAUI de .NET (.csproj) como elementos secundarios del <Project> nodo:

<!-- Android -->
<ItemGroup Condition="$(TargetFramework.StartsWith('net8.0-android')) != true">
  <Compile Remove="**\*.Android.cs" />
  <None Include="**\*.Android.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
</ItemGroup>

<!-- Both iOS and Mac Catalyst -->
<ItemGroup Condition="$(TargetFramework.StartsWith('net8.0-ios')) != true AND $(TargetFramework.StartsWith('net8.0-maccatalyst')) != true">
  <Compile Remove="**\*.MaciOS.cs" />
  <None Include="**\*.MaciOS.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
</ItemGroup>

<!-- iOS -->
<ItemGroup Condition="$(TargetFramework.StartsWith('net8.0-ios')) != true">
  <Compile Remove="**\*.iOS.cs" />
  <None Include="**\*.iOS.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
</ItemGroup>

<!-- Mac Catalyst -->
<ItemGroup Condition="$(TargetFramework.StartsWith('net8.0-maccatalyst')) != true">
  <Compile Remove="**\*.MacCatalyst.cs" />
  <None Include="**\*.MacCatalyst.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
</ItemGroup>

<!-- Windows -->
<ItemGroup Condition="$(TargetFramework.Contains('-windows')) != true">
  <Compile Remove="**\*.Windows.cs" />
  <None Include="**\*.Windows.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
</ItemGroup>

Este XML configura el sistema de compilación para quitar patrones de nombre de archivo basados en la plataforma en condiciones específicas:

  • No compile código de C# cuyo nombre de archivo termine con . Android.cs, si no está compilando para Android.
  • No compile código de C# cuyo nombre de archivo termine con . MaciOS.cs, si no está compilando para iOS y Mac Catalyst.
  • No compile código de C# cuyo nombre de archivo termine con .iOS.cs, si no está compilando para iOS.
  • No compile código de C# cuyo nombre de archivo termine con . MacCatalyst.cs, si no está compilando para Mac Catalyst.
  • No compile código de C# cuyo nombre de archivo termine con . Windows.cs, si no está compilando para Windows.

Importante

El destino múltiple basado en nombre de archivo se puede combinar con varios destinos basados en carpetas. Para obtener más información, vea Combinar el nombre de archivo y la carpeta multi-targeting.

Configuración de varios destinos basados en carpetas

Otro patrón estándar de múltiples destinos es incluir la plataforma como un nombre de carpeta. Por ejemplo, una carpeta denominada Android contendrá código específico de Android. El sistema de compilación se puede configurar para usar este patrón agregando el siguiente CÓDIGO XML al archivo del proyecto de aplicación MAUI de .NET (.csproj) como elementos secundarios del <Project> nodo:

<!-- Android -->
<ItemGroup Condition="$(TargetFramework.StartsWith('net8.0-android')) != true">
  <Compile Remove="**\Android\**\*.cs" />
  <None Include="**\Android\**\*.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
</ItemGroup>

<!-- Both iOS and Mac Catalyst -->
<ItemGroup Condition="$(TargetFramework.StartsWith('net8.0-ios')) != true AND $(TargetFramework.StartsWith('net8.0-maccatalyst')) != true">
  <Compile Remove="**\MaciOS\**\*.cs" />
  <None Include="**\MaciOS\**\*.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
</ItemGroup>

<!-- iOS -->
<ItemGroup Condition="$(TargetFramework.StartsWith('net8.0-ios')) != true">
  <Compile Remove="**\iOS\**\*.cs" />
  <None Include="**\iOS\**\*.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
</ItemGroup>

<!-- Mac Catalyst -->
<ItemGroup Condition="$(TargetFramework.StartsWith('net8.0-maccatalyst')) != true">
  <Compile Remove="**\MacCatalyst\**\*.cs" />
  <None Include="**\MacCatalyst\**\*.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
</ItemGroup>

<!-- Windows -->
<ItemGroup Condition="$(TargetFramework.Contains('-windows')) != true">
  <Compile Remove="**\Windows\**\*.cs" />
  <None Include="**\Windows\**\*.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
</ItemGroup>

Este XML configura el sistema de compilación para quitar patrones de carpeta basados en la plataforma en condiciones específicas:

  • No compile código de C# que se encuentre en la carpeta Android ni en la subcarpeta de la carpeta Android , si no está compilando para Android.
  • No compile código de C# que se encuentre en la carpeta MaciOS ni en la subcarpeta de la carpeta MaciOS , si no está compilando para iOS y Mac Catalyst.
  • No compile código de C# que se encuentre en la carpeta iOS ni en la subcarpeta de la carpeta iOS , si no está compilando para iOS.
  • No compile código de C# que se encuentre en la carpeta MacCatalyst ni en la subcarpeta de la carpeta MacCatalyst , si no está compilando para Mac Catalyst.
  • No compile código de C# que se encuentre en la carpeta Windows ni en la subcarpeta de la carpeta Windows , si no está compilando para Windows.

Importante

La compatibilidad multi-targeting basada en carpetas se puede combinar con la compatibilidad multi-targeting basada en nombre de archivo. Para obtener más información, vea Combinar el nombre de archivo y la carpeta multi-targeting.

Combinar el nombre de archivo y la carpeta multi-targeting

El destino múltiple basado en nombre de archivo se puede combinar con varios destinos basados en carpetas si es necesario. El sistema de compilación se puede configurar para usar este patrón agregando el siguiente CÓDIGO XML al archivo del proyecto de aplicación MAUI de .NET (.csproj) como elementos secundarios del <Project> nodo:

<!-- Android -->
<ItemGroup Condition="$(TargetFramework.StartsWith('net8.0-android')) != true">
  <Compile Remove="**\*.Android.cs" />
  <None Include="**\*.Android.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
  <Compile Remove="**\Android\**\*.cs" />
  <None Include="**\Android\**\*.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />  
</ItemGroup>

<!-- Both iOS and Mac Catalyst -->
<ItemGroup Condition="$(TargetFramework.StartsWith('net8.0-ios')) != true AND $(TargetFramework.StartsWith('net8.0-maccatalyst')) != true">
  <Compile Remove="**\*.MaciOS.cs" />
  <None Include="**\*.MaciOS.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
  <Compile Remove="**\MaciOS\**\*.cs" />
  <None Include="**\MaciOS\**\*.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
</ItemGroup>

<!-- iOS -->
<ItemGroup Condition="$(TargetFramework.StartsWith('net8.0-ios')) != true">
  <Compile Remove="**\*.iOS.cs" />
  <None Include="**\*.iOS.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
  <Compile Remove="**\iOS\**\*.cs" />
  <None Include="**\iOS\**\*.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />  
</ItemGroup>

<!-- Mac Catalyst -->
<ItemGroup Condition="$(TargetFramework.StartsWith('net8.0-maccatalyst')) != true">
  <Compile Remove="**\*.MacCatalyst.cs" />
  <None Include="**\*.MacCatalyst.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
  <Compile Remove="**\MacCatalyst\**\*.cs" />
  <None Include="**\MacCatalyst\**\*.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
</ItemGroup>

<!-- Windows -->
<ItemGroup Condition="$(TargetFramework.Contains('-windows')) != true">
  <Compile Remove="**\*.Windows.cs" />
  <None Include="**\*.Windows.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
  <Compile Remove="**\Windows\**\*.cs" />
  <None Include="**\Windows\**\*.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />  
</ItemGroup>

Este XML configura el sistema de compilación para quitar patrones de carpeta y nombre de archivo basados en la plataforma en condiciones específicas:

  • No compile código de C# cuyo nombre de archivo termine con . Android.cs, o que se encuentra en la carpeta o subcarpeta Android de la carpeta Android , si no está compilando para Android.
  • No compile código de C# cuyo nombre de archivo termine con . MaciOS.cs, o que se encuentra en la carpeta MaciOS o la subcarpeta de la carpeta MaciOS , si no está compilando para iOS y Mac Catalyst.
  • No compile código de C# cuyo nombre de archivo termine con .iOS.cs o que se encuentre en la carpeta iOS o en la subcarpeta de la carpeta iOS , si no está compilando para iOS.
  • No compile código de C# cuyo nombre de archivo termine con . MacCatalyst.cs, o que se encuentra en la carpeta MacCatalyst o subcarpeta de la carpeta MacCatalyst , si no está compilando para Mac Catalyst.
  • No compile código de C# cuyo nombre de archivo termine con . Windows.cs, o que se encuentra en la carpeta o subcarpeta de Windows de la carpeta Windows , si no está compilando para Windows.