调用平台代码

.NET 多平台应用 UI (.NET MAUI) 应用可以将多目标与分部类和分部方法相结合,以从跨平台代码调用平台代码。

重要

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

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

Platform folders screenshot.

每个目标平台的文件夹包含特定于平台的代码,这些代码在每个平台上启动应用,以及添加的任何其他平台代码。 在生成时,生成系统仅在为该特定平台生成时包含每个文件夹中的代码。 例如,为 Android 生成时,PlatformsAndroid> 文件夹中的文件将内置到应用包中,但其他平台文件夹中的文件不会。 此方法使用一个名为“多目标”的功能从单个项目面向多个平台。

可以将多目标与分部类和分部方法结合使用,以从跨平台代码调用平台功能。 从跨平台代码调用平台代码的过程是:

  1. 将跨平台 API 定义为一个分部类,用于定义要在每个平台上调用的任何操作的部分方法签名。 有关详细信息,请参阅 定义跨平台 API
  2. 通过定义相同的分部类和相同的分部方法签名,同时提供方法实现,实现每个平台的跨平台 API。 有关详细信息,请参阅 每个平台实现 API
  3. 通过创建分部类的实例并根据需要调用其方法来调用跨平台 API。 有关详细信息,请参阅 调用跨平台 API

定义跨平台 API

若要从跨平台代码调用平台代码,第一步是将跨平台 API 定义为 分部类,该部分类 定义要在每个平台上调用的任何操作的部分 方法 签名。

以下示例演示可用于检索设备方向的跨平台 API:

namespace InvokePlatformCodeDemos.Services
{
    public enum DeviceOrientation
    {
        Undefined,
        Landscape,
        Portrait
    }

    public partial class DeviceOrientationService
    {
        public partial DeviceOrientation GetOrientation();
    }
}

分部类命名 DeviceOrientationService,其中包括一个名为 GetOrientation的分部方法。

每个平台实现 API

定义跨平台 API 后,必须通过定义相同的分部类和相同的分部方法签名,并在所需的平台上实现该 API,同时提供方法实现。

平台实现应放置在正确的 平台 子文件夹中,以确保生成系统仅在为特定平台生成时尝试生成平台代码。 下表列出了平台实现的默认文件夹位置:

平台 Folder
Android 平台>Android
iOS 平台>Ios
MacCatalyst 平台>MacCatalyst
Windows 平台>Windows

重要

平台实现必须位于定义跨平台 API 的同一命名空间和同一类中。

以下屏幕截图显示了 DeviceOrientationServiceAndroidiOS 文件夹中的类:

DeviceOrientationService classes in their Platforms folder screenshot.

或者,可以根据自己的文件名和文件夹条件(而不是使用 平台 文件夹)执行多目标。 有关详细信息,请参阅 配置多目标

Android

以下示例演示 Android 上方法的 GetOrientation 实现:

using Android.Content;
using Android.Runtime;
using Android.Views;

namespace InvokePlatformCodeDemos.Services
{
    public partial class DeviceOrientationService
    {
        public partial DeviceOrientation GetOrientation()
        {
            IWindowManager windowManager = Android.App.Application.Context.GetSystemService(Context.WindowService).JavaCast<IWindowManager>();
            SurfaceOrientation orientation = windowManager.DefaultDisplay.Rotation;
            bool isLandscape = orientation == SurfaceOrientation.Rotation90 || orientation == SurfaceOrientation.Rotation270;
            return isLandscape ? DeviceOrientation.Landscape : DeviceOrientation.Portrait;
        }
    }
}

iOS

以下示例演示 iOS 上方法的 GetOrientation 实现:

using UIKit;

namespace InvokePlatformCodeDemos.Services
{
    public partial class DeviceOrientationService
    {
        public partial DeviceOrientation GetOrientation()
        {
            UIInterfaceOrientation orientation = UIApplication.SharedApplication.StatusBarOrientation;
            bool isPortrait = orientation == UIInterfaceOrientation.Portrait || orientation == UIInterfaceOrientation.PortraitUpsideDown;
            return isPortrait ? DeviceOrientation.Portrait : DeviceOrientation.Landscape;
        }
    }
}

调用跨平台 API

提供平台实现后,可以通过创建对象实例并调用其操作,从跨平台代码调用 API:

using InvokePlatformCodeDemos.Services;
...

DeviceOrientationService deviceOrientationService = new DeviceOrientationService();
DeviceOrientation orientation = deviceOrientationService.GetOrientation();

在生成时,生成系统将使用多目标将跨平台分部类与目标平台的分部类相结合,并将其构建到应用包中。

配置多目标

.NET MAUI 应用也可以基于自己的文件名和文件夹条件进行多目标化。 这样,便可以构建 .NET MAUI 应用项目,这样就不必将平台代码放入 Platform 文件夹的子文件夹中。

例如,标准多目标模式是将平台作为扩展包含在平台代码的文件名中。 可以配置生成系统,以基于以下模式将跨平台分部类与平台分部类组合在一起:

DeviceOrientationService classes using filename-based multi-targeting.

另一种标准多目标模式是将平台作为文件夹名称包含在内。 可以配置生成系统,以基于以下模式将跨平台分部类与平台分部类组合在一起:

DeviceOrientationService classes using folder-based multi-targeting.

有关详细信息,请参阅 配置多目标