Настройка многоцелевой настройки
Многоплатформенные приложения пользовательского интерфейса приложений .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.