配置多目标

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

重要

.NET 多平台应用 UI (.NET MAUI) 目前为预览版。 此内容与发布前可能进行实质性修改的预发布产品相关。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。

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

Platform folders screenshot.

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

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

配置基于文件名的多目标

标准多目标模式是将平台作为扩展包含在平台代码的文件名中。 例如, MyService.Android.cs 表示类的特定于 Android 的 MyService 实现。 通过将以下 XML 添加到 .NET MAUI 应用项目 (.csproj) 文件作为节点的 <Project> 子级,可以将生成系统配置为使用此模式:

<ItemGroup Condition="$(TargetFramework.StartsWith('net6.0-android')) != true">
  <Compile Remove="**\**\*.Android.cs" />
  <None Include="**\**\*.Android.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
</ItemGroup>

<ItemGroup Condition="$(TargetFramework.StartsWith('net6.0-ios')) != true AND $(TargetFramework.StartsWith('net6.0-maccatalyst')) != true">
  <Compile Remove="**\**\*.iOS.cs" />
  <None Include="**\**\*.iOS.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
</ItemGroup>

<ItemGroup Condition="$(TargetFramework.Contains('-windows')) != true ">
  <Compile Remove="**\*.Windows.cs" />
  <None Include="**\*.Windows.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
</ItemGroup>

此 XML 将生成系统配置为在特定条件下删除基于平台的文件名模式:

  • 不要编译文件名以 . 结尾的 C# 代码 。Android.cs(如果未为 Android 生成)。
  • 如果不为 iOS 或 MacCatalyst 生成文件名以 .iOS.cs 结尾的 C# 代码,请不要编译其文件名。
  • 不要编译文件名以 .Windows 结尾的 C# 代码。cs,如果不为Windows生成。

重要

基于文件名的多目标可以与基于文件夹的多目标组合在一起。 有关详细信息,请参阅 合并文件名和文件夹多目标

配置基于文件夹的多目标

另一种标准多目标模式是将平台作为文件夹名称包含在内。 例如,名为 Android 的文件夹将包含特定于 Android 的代码。 通过将以下 XML 添加到 .NET MAUI 应用项目 (.csproj) 文件作为节点的 <Project> 子级,可以将生成系统配置为使用此模式:

<ItemGroup Condition="$(TargetFramework.StartsWith('net6.0-android')) != true">
  <Compile Remove="**\Android\**\*.cs" />
  <None Include="**\Android\**\*.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
</ItemGroup>

<ItemGroup Condition="$(TargetFramework.StartsWith('net6.0-ios')) != true AND $(TargetFramework.StartsWith('net6.0-maccatalyst')) != true">
  <Compile Remove="**\iOS\**\*.cs" />
  <None Include="**\iOS\**\*.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
</ItemGroup>

<ItemGroup Condition="$(TargetFramework.Contains('-windows')) != true ">
  <Compile Remove="**\Windows\**\*.cs" />
  <None Include="**\Windows\**\*.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
</ItemGroup>

此 XML 将生成系统配置为在特定条件下删除基于平台的文件夹模式:

  • 如果不为 Android 生成,请不要编译位于 Android 文件夹或 Android 文件夹的子文件夹中的 C# 代码。
  • 如果不为 iOS 或 MacCatalyst 生成 iOS 文件夹,请不要编译位于 iOS 文件夹或 iOS 文件夹的子文件夹中的 C# 代码。
  • 如果不为Windows生成,请不要编译位于Windows文件夹或Windows文件夹的子文件夹中的 C# 代码。

重要

基于文件夹的多目标可以与基于文件名的多目标组合在一起。 有关详细信息,请参阅 合并文件名和文件夹多目标

合并文件名和文件夹多目标

如果需要,可以将基于文件名的多目标与基于文件夹的多目标组合在一起。 通过将以下 XML 添加到 .NET MAUI 应用项目 (.csproj) 文件作为节点的 <Project> 子级,可以将生成系统配置为使用此模式:

<ItemGroup Condition="$(TargetFramework.StartsWith('net6.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>

<ItemGroup Condition="$(TargetFramework.StartsWith('net6.0-ios')) != true AND $(TargetFramework.StartsWith('net6.0-maccatalyst')) != true">
  <Compile Remove="**\**\*.iOS.cs" />
  <None Include="**\**\*.iOS.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
  <Compile Remove="**\iOS\**\*.cs" />
  <None Include="**\iOS\**\*.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />  
</ItemGroup>

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