Настройка многоцелевой настройки

Многоплатформенные приложения пользовательского интерфейса приложений .NET (.NET MAUI) используют многонацелие для целевых платформ из одного проекта.

Проект для приложения .NET MAUI содержит папку "Платформы " с каждой дочерней папкой, представляющей платформу, на которую может ориентироваться .NET MAUI:

Снимок экрана папок платформы.

Папки для каждой целевой платформы содержат код для конкретной платформы, который запускает приложение на каждой платформе, а также любой дополнительный код платформы, который вы добавляете. Во время сборки система содержит только код из каждой папки при сборке для этой конкретной платформы. Например, при сборке для Android файлы в папке "Платформы>Android " будут встроены в пакет приложения, но файлы в других папках платформ не будут.

В дополнение к этому подходу с несколькими целевыми объектами по умолчанию приложения MAUI .NET также могут быть многоцелыми на основе собственных критериев имени файла и папки. Это позволяет структурировать проект приложения .NET MAUI, чтобы не помещать код платформы в вложенные папки папки "Платформы ".

Настройка многонацеливания на основе имен файлов

Стандартный шаблон с несколькими целевыми объектами — включить платформу в качестве расширения в имя файла кода платформы. Например, MyService.Android.cs представляет собой реализацию класса, зависящую MyService от Android. Систему сборки можно настроить для использования этого шаблона, добавив следующий XML-код в файл проекта приложения .NET MAUI (CSPROJ) в качестве дочерних <Project> элементов узла:

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

Этот XML-код настраивает систему сборки для удаления шаблонов имен файлов на основе платформы в определенных условиях:

  • Не компилируйте код C#, имя файла которого заканчивается . Android.cs, если вы не создаете сборку для Android.
  • Не компилируйте код C#, имя файла которого заканчивается . MaciOS.cs, если вы не создаете для iOS и Mac Catalyst.
  • Не компилируйте код C#, имя файла которого заканчивается на .iOS.cs, если вы не создаете код для iOS.
  • Не компилируйте код C#, имя файла которого заканчивается . MacCatalyst.cs, если вы не создаете для Mac Catalyst.
  • Не компилируйте код C#, имя файла которого заканчивается . Файл Windows.cs, если вы не создаете сборку для Windows.

Важно!

Многонацелие на основе файлов можно объединить с многоцелевой ориентацией на основе папок. Дополнительные сведения см. в разделе "Объединение имен файлов и папок с несколькими целевыми объектами".

Настройка мультинацеливания на основе папок

Еще одним стандартным шаблоном многонацеливания является включение платформы в качестве имени папки. Например, папка с именем Android будет содержать код, зависящий от Android. Систему сборки можно настроить для использования этого шаблона, добавив следующий XML-код в файл проекта приложения .NET MAUI (CSPROJ) в качестве дочерних <Project> элементов узла:

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

Этот XML-код настраивает систему сборки для удаления шаблонов папок на основе платформы в определенных условиях:

  • Не компилируйте код C#, расположенный в папке Android или вложенной папке папки Android , если вы не создаете сборку для Android.
  • Не компилируйте код C#, расположенный в папке MaciOS или вложенной папке папки MaciOS , если вы не создаете сборку для iOS и Mac Catalyst.
  • Не компилируйте код C#, расположенный в папке iOS или вложенной папке папки iOS, если вы не используете сборку для iOS .
  • Не компилируйте код C#, расположенный в папке MacCatalyst , или вложенную папку папки MacCatalyst , если вы не создаете сборку для Mac Catalyst.
  • Не компилируйте код C#, расположенный в папке Windows или вложенной папке папки Windows , если вы не создаете сборку для Windows.

Важно!

Мультинацеливание на основе папок можно объединить с многонацелевой ориентацией на основе файлов. Дополнительные сведения см. в разделе "Объединение имен файлов и папок с несколькими целевыми объектами".

Объединение имен файлов и папок с несколькими целевыми объектами

Многонацелие на основе файлов можно сочетать с многонацелевой ориентацией на основе папок, если это необходимо. Систему сборки можно настроить для использования этого шаблона, добавив следующий XML-код в файл проекта приложения .NET MAUI (CSPROJ) в качестве дочерних <Project> элементов узла:

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

Этот XML-код настраивает систему сборки для удаления шаблонов файлов и папок на основе платформы в определенных условиях:

  • Не компилируйте код C#, имя файла которого заканчивается . Android.cs или находится в папке Android или вложенной папке в папке Android , если вы не создаете сборку для Android.
  • Не компилируйте код C#, имя файла которого заканчивается . MaciOS.cs или находится в папке MaciOS или вложенной папке папки MaciOS , если вы не создаете сборку для iOS и Mac Catalyst.
  • Не компилируйте код C#, имя файла которого заканчивается на .iOS.cs или находится в папке iOS или вложенной папке папки iOS , если вы не создаете для iOS.
  • Не компилируйте код C#, имя файла которого заканчивается . Файл MacCatalyst.cs или находится в папке MacCatalyst или вложенной папке папки MacCatalyst , если вы не создаете сборку для Mac Catalyst.
  • Не компилируйте код C#, имя файла которого заканчивается . Файл Windows.cs или находится в папке Windows или вложенной папке папки Windows , если вы не используете сборку для Windows.