マルチターゲットの構成

.NET マルチプラットフォーム アプリ UI (.NET MAUI) アプリは、マルチターゲティングを使用して、1 つのプロジェクトから複数のプラットフォームをターゲットにします。

.NET MAUI アプリのプロジェクトには Platforms フォルダーが含まれています。各子フォルダーは、.NET MAUI がターゲットにできるプラットフォームを表します。

プラットフォーム フォルダーのスクリーンショット。

各ターゲット プラットフォームのフォルダーには、各プラットフォームでアプリを起動するプラットフォーム固有のコードと、追加するプラットフォーム コードが含まれています。 ビルド時に、ビルド システムには、その特定のプラットフォーム用にビルドするときに、各フォルダーからのコードのみが含まれます。 たとえば、Android 用にビルドする場合、 Platforms>Android フォルダー内のファイルはアプリ パッケージに組み込まれますが、他の Platforms フォルダー内のファイルは作成されません。

この既定のマルチターゲットアプローチに加えて、.NET MAUI アプリは、独自のファイル名とフォルダーの条件に基づいて複数のターゲットを設定することもできます。 これにより、プラットフォーム コードを Platforms フォルダーのサブフォルダーに配置する必要がないように、.NET MAUI アプリ プロジェクトを構築できます。

ファイル名ベースのマルチターゲットを構成する

標準のマルチターゲット パターンでは、プラットフォーム コードのファイル名にプラットフォームを拡張機能として含めます。 たとえば、 MyService.Android.cs は、Android 固有のクラスの実装を MyService 表します。 このパターンを使用するようにビルド システムを構成するには、次の 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.cs。
  • ファイル名が .で終わる C# コードをコンパイルしないでください 。iOS および Mac Catalyst 用にビルドしていない場合は、MaciOS.cs。
  • iOS 用にビルドしていない場合は、ファイル名が .iOS.cs で終わる C# コードをコンパイルしないでください。
  • ファイル名が .で終わる C# コードをコンパイルしないでください 。Mac Catalyst 用にビルドしていない場合は、MacCatalyst.cs
  • ファイル名が .で終わる C# コードをコンパイルしないでください 。Windows 用にビルドしていない場合は、Windows.cs。

重要

ファイル名ベースのマルチターゲティングは、フォルダーベースのマルチターゲティングと組み合わせることができます。 詳細については、「 ファイル名とフォルダーのマルチターゲットの組み合わせ」を参照してください。

フォルダーベースのマルチターゲットを構成する

もう 1 つの標準的なマルチターゲット パターンは、プラットフォームをフォルダー名として含める方法です。 たとえば、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 は、特定の条件下でプラットフォーム ベースのフォルダー パターンを削除するようにビルド システムを構成します。

  • Android 用にビルドしていない場合は、 Android フォルダーまたは Android フォルダーのサブフォルダーにある C# コードをコンパイルしないでください。
  • iOS と Mac Catalyst 用にビルドしていない場合は、 MaciOS フォルダーまたは MaciOS フォルダーのサブフォルダーにある C# コードをコンパイルしないでください。
  • iOS 用にビルドしていない場合は、 iOS フォルダーまたは iOS フォルダーのサブフォルダーにある C# コードをコンパイルしないでください。
  • Mac Catalyst 用にビルドしていない場合は、 MacCatalyst フォルダーまたは MacCatalyst フォルダーのサブフォルダーにある C# コードをコンパイルしないでください。
  • Windows 用にビルドしていない場合は、 Windows フォルダーまたは Windows フォルダーのサブフォルダーにある C# コードをコンパイルしないでください。

重要

フォルダーベースのマルチターゲティングは、ファイル名ベースのマルチターゲティングと組み合わせることができます。 詳細については、「 ファイル名とフォルダーのマルチターゲットの組み合わせ」を参照してください。

ファイル名とフォルダーのマルチターゲットを組み合わせる

必要に応じて、ファイル名ベースのマルチターゲティングをフォルダーベースのマルチターゲティングと組み合わせることができます。 このパターンを使用するようにビルド システムを構成するには、次の 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 用にビルドしていない場合は、Android.cs、または Android フォルダーの Android フォルダーまたはサブフォルダーにあります。
  • ファイル名が .で終わる C# コードをコンパイルしないでください 。MaciOS.cs、または iOS と Mac Catalyst 用にビルドしていない場合は、 MaciOS フォルダーまたは MaciOS フォルダーのサブフォルダーにあります。
  • ファイル名が .iOS.cs で終わる C# コード、または iOS 用にビルドしていない場合は 、iOS フォルダーまたは iOS フォルダーのサブフォルダーにある C# コードをコンパイルしないでください。
  • ファイル名が .で終わる C# コードをコンパイルしないでください 。MacCatalyst.cs、または Mac Catalyst 用にビルドしていない場合は、 MacCatalyst フォルダーまたは MacCatalyst フォルダーのサブフォルダーにあります。
  • ファイル名が .で終わる C# コードをコンパイルしないでください 。Windows 用にビルドしていない場合は、Windows.cs、または Windows フォルダーの Windows フォルダーまたはサブフォルダーにあります。