Configurar vários direcionamentos

Os aplicativos maui da interface do usuário de aplicativo de várias plataformas do .NET (.NET MAUI) usam vários direcionamentos para direcionar várias plataformas de um único projeto.

O projeto de um aplicativo .NET MAUI contém uma pasta Plataformas , com cada pasta filho representando uma plataforma que o MAUI do .NET pode direcionar:

Captura de tela de pastas da plataforma.

As pastas para cada plataforma de destino contêm código específico da plataforma que inicia o aplicativo em cada plataforma, além de qualquer código de plataforma adicional que você adicionar. No tempo de compilação, o sistema de build inclui apenas o código de cada pasta ao criar para essa plataforma específica. Por exemplo, quando você compilar para Android, os arquivos na pasta PlataformasAndroid serão incorporados> ao pacote do aplicativo, mas os arquivos nas outras pastas plataformas não serão.

Além dessa abordagem padrão de vários destinos, os aplicativos MAUI do .NET também podem ser multilocatários com base em seus próprios critérios de nome de arquivo e pasta. Isso permite estruturar seu projeto de aplicativo .NET MAUI para que você não precise colocar o código da plataforma em subpastas da pasta Plataformas .

Configurar multiplataforma baseada em nome de arquivo

Um padrão padrão de vários destinos é incluir a plataforma como uma extensão no nome do arquivo para o código da plataforma. Por exemplo, MyService.Android.cs representaria uma implementação específica do Android da MyService classe. O sistema de build pode ser configurado para usar esse padrão adicionando o seguinte XML ao arquivo .NET MAUI app project (.csproj) como filhos do <Project> nó:

<!-- 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>

Esse XML configura o sistema de build para remover padrões de nome de arquivo baseados em plataforma em condições específicas:

  • Não compile o código C# cujo nome de arquivo termina com . Android.cs, se você não estiver criando para Android.
  • Não compile o código C# cujo nome de arquivo termina com . MaciOS.cs, se você não estiver criando para iOS e Mac Catalyst.
  • Não compile o código C# cujo nome de arquivo termina com .iOS.cs, se você não estiver criando para iOS.
  • Não compile o código C# cujo nome de arquivo termina com . MacCatalyst.cs, se você não estiver criando para Mac Catalyst.
  • Não compile o código C# cujo nome de arquivo termina com . Windows.cs, se você não estiver criando para o Windows.

Importante

O multiplataforma baseado em nome de arquivo pode ser combinado com vários destinos baseados em pastas. Para obter mais informações, consulte Combinar nome de arquivo e multiplataforma de pasta.

Configurar multiplataforma baseada em pasta

Outro padrão padrão de vários destinos é incluir a plataforma como um nome de pasta. Por exemplo, uma pasta chamada Android conteria código específico do Android. O sistema de build pode ser configurado para usar esse padrão adicionando o seguinte XML ao arquivo .NET MAUI app project (.csproj) como filhos do <Project> nó:

<!-- 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 o sistema de build para remover padrões de pasta baseados em plataforma em condições específicas:

  • Não compile o código C# localizado na pasta Android ou na subpasta da pasta android , se você não estiver criando para Android.
  • Não compile o código C# localizado na pasta MaciOS ou na subpasta da pasta MaciOS , se você não estiver criando para iOS e Mac Catalyst.
  • Não compile o código C# localizado na pasta iOS ou na subpasta da pasta iOS , se você não estiver criando para iOS.
  • Não compile o código C# localizado na pasta MacCatalyst ou na subpasta da pasta MacCatalyst , se você não estiver criando para Mac Catalyst.
  • Não compile o código C# localizado na pasta do Windows ou na subpasta da pasta do Windows , se você não estiver criando para o Windows.

Importante

O multiplataforma baseado em pasta pode ser combinado com vários destinos baseados em nome de arquivo. Para obter mais informações, consulte Combinar nome de arquivo e multiplataforma de pasta.

Combinar nome de arquivo e multiplataforma de pasta

O multiplataforma baseado em nome de arquivo pode ser combinado com vários destinos baseados em pasta, se necessário. O sistema de build pode ser configurado para usar esse padrão adicionando o seguinte XML ao arquivo .NET MAUI app project (.csproj) como filhos do <Project> nó:

<!-- 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>

Esse XML configura o sistema de build para remover padrões de pasta e nome de arquivo baseados em plataforma em condições específicas:

  • Não compile o código C# cujo nome de arquivo termina com . Android.cs, ou que está localizado na pasta Android ou subpasta da pasta Android , se você não estiver criando para Android.
  • Não compile o código C# cujo nome de arquivo termina com . MaciOS.cs, ou que está localizado na pasta maciOS ou subpasta da pasta MaciOS , se você não estiver criando para iOS e Mac Catalyst.
  • Não compile o código C# cujo nome de arquivo termina com .iOS.cs ou que esteja localizado na pasta do iOS ou na subpasta da pasta iOS , se você não estiver criando para iOS.
  • Não compile o código C# cujo nome de arquivo termina com . MacCatalyst.cs, ou que está localizado na pasta MacCatalyst ou subpasta da pasta MacCatalyst , se você não estiver criando para Mac Catalyst.
  • Não compile o código C# cujo nome de arquivo termina com . Windows.cs, ou que está localizado na pasta ou subpasta do Windows da pasta do Windows , se você não estiver criando para Windows.