다중 대상 지정 구성

.NET 다중 플랫폼 앱 UI(.NET MAUI) 앱은 다중 대상을 사용하여 단일 프로젝트에서 여러 플랫폼을 대상으로 합니다.

.NET MAUI 앱에 대한 프로젝트에는 .NET MAUI에서 대상으로 지정할 수 있는 플랫폼을 나타내는 각 자식 폴더가 있는 Platforms 폴더가 포함되어 있습니다.

플랫폼 폴더 스크린샷

각 대상 플랫폼의 폴더에는 각 플랫폼에서 앱을 시작하는 플랫폼별 코드와 추가하는 추가 플랫폼 코드가 포함되어 있습니다. 빌드 시 빌드 시스템에는 특정 플랫폼을 빌드할 때 각 폴더의 코드만 포함됩니다. 예를 들어 Android용으로 빌드할 때 Platforms>Android 폴더의 파일은 앱 패키지에 빌드되지만 다른 Platforms 폴더의 파일은 빌드되지 않습니다.

이 기본 다중 대상 지정 방법 외에도 .NET MAUI 앱은 사용자 고유의 파일 이름 및 폴더 조건에 따라 다중 대상을 지정할 수 있습니다. 이렇게 하면 플랫폼 코드를 Platforms 폴더의 하위 폴더에 배치할 필요가 없도록 .NET MAUI 앱 프로젝트를 구성할 수 있습니다.

파일 이름 기반 다중 대상 지정 구성

표준 다중 대상 지정 패턴은 플랫폼을 플랫폼 코드의 파일 이름에 확장명으로 포함하는 것입니다. 예를 들어 MyService.Android.cs 는 클래스의 Android 관련 구현을 MyService 나타냅니다. .NET MAUI 앱 프로젝트(.csproj) 파일에 다음 XML을 노드의 <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용으로 빌드하지 않는 경우
  • iOS용으로 빌드하지 않는 경우 파일 이름이 .iOS.cs로 끝나는 C# 코드를 컴파일하지 마세요.
  • 파일 이름이 .로 끝나는 C# 코드를 컴파일하지 마세요 . MacCatalyst.cs, Mac Catalyst용으로 빌드하지 않는 경우
  • 파일 이름이 .로 끝나는 C# 코드를 컴파일하지 마세요 . Windows용으로 빌드하지 않는 경우 Windows.cs.

중요

파일 이름 기반 다중 대상 지정을 폴더 기반 다중 대상 지정과 결합할 수 있습니다. 자세한 내용은 파일 이름 및 폴더 다중 대상 결합을 참조하세요.

폴더 기반 다중 대상 지정 구성

또 다른 표준 다중 대상 지정 패턴은 플랫폼을 폴더 이름으로 포함하는 것입니다. 예를 들어 Android라는 폴더에는 Android 관련 코드가 포함됩니다. .NET MAUI 앱 프로젝트(.csproj) 파일에 다음 XML을 노드의 <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# 코드를 컴파일하지 마세요.

중요

폴더 기반 다중 대상 지정을 파일 이름 기반 다중 대상 지정과 결합할 수 있습니다. 자세한 내용은 파일 이름 및 폴더 다중 대상 결합을 참조하세요.

파일 이름 및 폴더 다중 대상 지정 결합

필요한 경우 파일 이름 기반 다중 대상 지정을 폴더 기반 다중 대상 지정과 결합할 수 있습니다. .NET MAUI 앱 프로젝트(.csproj) 파일에 다음 XML을 노드의 <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# 코드를 컴파일하지 마세요 . iOS 및 Mac Catalyst용으로 빌드하지 않는 경우 MaciOS.cs 또는 MaciOS 폴더의 MaciOS 폴더 또는 하위 폴더에 있는 MaciOS.cs입니다.
  • iOS용으로 빌드하지 않는 경우 파일 이름이 .iOS.cs로 끝나거나 iOS 폴더의 iOS 폴더 또는 하위 폴더에 있는 C# 코드를 컴파일하지 마세요.
  • 파일 이름이 .로 끝나는 C# 코드를 컴파일하지 마세요 . Mac Catalyst용으로 빌드하지 않는 경우 MacCatalyst.cs 또는 MacCatalyst 폴더의 MacCatalyst 폴더 또는 하위 폴더에 있습니다.
  • 파일 이름이 .로 끝나는 C# 코드를 컴파일하지 마세요 . Windows용으로 빌드하지 않는 경우 Windows.cs 또는 Windows 폴더의Windows 폴더 또는 하위 폴더에 있는 Windows.cs입니다.