配置多目标

.NET 多平台应用 UI (.NET MAUI) 应用使用多目标从单个项目面向多个平台。

.NET MAUI 应用的项目包含 一个 Platform 文件夹,每个子文件夹都表示 .NET MAUI 可以面向的平台:

平台文件夹屏幕截图。

每个目标平台的文件夹包含特定于平台的代码,这些代码在每个平台上启动应用,以及添加的任何其他平台代码。 在生成时,生成系统仅包含为该特定平台生成时每个文件夹中的代码。 例如,当你为 Android 生成时, 平台>Android 文件夹中的文件将内置到应用包中,但其他 平台 文件夹中的文件不会。

除了此默认的多目标方法之外,.NET MAUI 应用还可以基于自己的文件名和文件夹条件进行多目标处理。 这使你可以构建 .NET MAUI 应用项目,这样就不必将平台代码放入 Platform 文件夹的子文件夹中。

配置基于文件名的多目标

标准多目标模式是将平台作为扩展包含在平台代码的文件名中。 例如, 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.cs(如果未为 Android 生成)。
  • 不要编译文件名以 . 结尾的 C# 代码 。MaciOS.cs,如果不为 iOS 和 Mac Catalyst 生成。
  • 如果不为 iOS 生成文件名以 .iOS.cs 结尾,请不要编译其文件名为 .iOS.cs 的 C# 代码。
  • 不要编译文件名以 . 结尾的 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 将生成系统配置为在特定条件下删除基于平台的文件夹模式:

  • 如果不为 Android 生成,请不要编译位于 Android 文件夹或 Android 文件夹的子文件夹中的 C# 代码。
  • 如果不为 iOS 和 Mac Catalyst 生成,请不要编译位于 MaciOS 文件夹或 MaciOS 文件夹的子文件夹中的 C# 代码。
  • 如果不为 iOS 生成,请不要编译位于 iOS 文件夹或 iOS 文件夹的子文件夹中的 C# 代码。
  • 如果不为 MacCatalyst 文件夹生成,请不要编译位于 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.cs,或者位于 Android 文件夹的 Android 文件夹或子文件夹中(如果未为 Android 生成)。
  • 不要编译文件名以 . 结尾的 C# 代码。MaciOS.cs 或位于 MaciOS 文件夹或 MaciOS 文件夹的子文件夹中(如果未为 iOS 和 Mac Catalyst 生成)。
  • 如果不为 iOS 生成,则不要编译文件名以 .iOS.cs 结尾的 C# 代码,或者该代码位于 iOS 文件夹的 iOS 文件夹或子文件夹中。
  • 不要编译文件名以 . 结尾的 C# 代码 。MacCatalyst.cs 或位于 MacCatalyst 文件夹的 MacCatalyst 文件夹或子文件夹中(如果未为 MacCatalyst 生成)。
  • 不要编译文件名以 . 结尾的 C# 代码 。Windows.cs,或者位于 Windows 文件夹的 Windows 文件夹或子文件夹中(如果未为 Windows 生成)。