叫用平臺程式碼
在 .NET 多平臺應用程式 UI (.NET MAUI) 不提供存取特定平臺 API 的任何 API 的情況下,您可以撰寫自己的程式碼來存取所需的平臺 API。 這需要瞭解Apple 的 iOS 和 MacCatalyst API、Google 的 Android API,以及Microsoft 的Windows 應用程式 SDK API。
平臺程式碼可以使用條件式編譯,或使用部分類別和部分方法,從跨平臺程式碼叫用。
條件式編譯
您可以使用條件式編譯,以不同的平臺為目標,從跨平臺程式碼叫用平臺程式碼。
下列範例顯示 DeviceOrientation
列舉,其將用來指定裝置的方向:
namespace InvokePlatformCodeDemos.Services
{
public enum DeviceOrientation
{
Undefined,
Landscape,
Portrait
}
}
擷取裝置的方向需要撰寫平臺程式碼。 這可藉由撰寫使用條件式編譯以不同平臺為目標的方法來完成:
#if ANDROID
using Android.Content;
using Android.Views;
using Android.Runtime;
#elif IOS
using UIKit;
#endif
using InvokePlatformCodeDemos.Services;
namespace InvokePlatformCodeDemos.Services.ConditionalCompilation
{
public class DeviceOrientationService
{
public DeviceOrientation GetOrientation()
{
#if ANDROID
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;
#elif IOS
UIInterfaceOrientation orientation = UIApplication.SharedApplication.StatusBarOrientation;
bool isPortrait = orientation == UIInterfaceOrientation.Portrait || orientation == UIInterfaceOrientation.PortraitUpsideDown;
return isPortrait ? DeviceOrientation.Portrait : DeviceOrientation.Landscape;
#else
return DeviceOrientation.Undefined;
#endif
}
}
}
在此範例中 GetOrientation
,系統會為 Android 和 iOS 提供 方法的平臺實作。 在其他平臺上, DeviceOrientation.Undefined
會傳回 。 或者,您可以擲回 DeviceOrientation.Undefined
, PlatformNotSupportedException
指定提供實作的平臺:
throw new PlatformNotSupportedException("GetOrientation is only supported on Android and iOS.");
DeviceOrientationService.GetOrientation
然後,您可以藉由建立物件實例並叫用其作業,從跨平臺程式碼叫用 方法:
using InvokePlatformCodeDemos.Services;
using InvokePlatformCodeDemos.Services.ConditionalCompilation;
...
DeviceOrientationService deviceOrientationService = new DeviceOrientationService();
DeviceOrientation orientation = deviceOrientationService.GetOrientation();
在建置階段,建置系統會使用條件式編譯,將 Android 和 iOS 平臺程式碼設為正確的平臺。
如需條件式編譯的詳細資訊,請參閱 條件式編譯。
部分類別和方法
.NET MAUI 應用程式專案包含 Platform 資料夾,每個子資料夾代表 .NET MAUI 可以鎖定的平臺:
每個目標平臺的資料夾都包含平臺特定程式碼,這些程式碼會在每個平臺上啟動應用程式,以及您新增的任何其他平臺程式碼。 在建置階段,建置系統只會在針對該特定平臺建置時,包含來自每個資料夾的程式碼。 例如,當您建置 Android 時,[平臺>Android] 資料夾中的檔案會內建到應用程式套件中,但其他[平臺] 資料夾中的檔案將不會是 。 此方法使用稱為多重目標的功能,從單一專案以多個平臺為目標。
多重目標可以與部分類別和部分方法結合,以從跨平臺程式碼叫用平臺功能。 執行此動作的程式是:
- 將跨平臺 API 定義為部分類別,針對您想要在每個平臺上叫用的任何作業定義部分方法簽章。 如需詳細資訊,請參閱 定義跨平臺 API。
- 藉由定義相同的部分類別和相同的部分方法簽章,同時提供方法實作,實作每個平臺的跨平臺 API。 如需詳細資訊,請參閱 針對每個平臺實作 API。
- 建立部分類別的實例,並視需要叫用其方法,以叫用跨平臺 API。 如需詳細資訊,請參閱 叫用跨平臺 API。
定義跨平臺 API
若要從跨平臺程式碼叫用平臺程式碼,第一個步驟是將跨平臺 API 定義為 部分類別 ,針對您想要在每個平臺上叫用的任何作業定義 部分方法 簽章。
下列範例顯示 DeviceOrientation
列舉,其將用來指定裝置的方向:
namespace InvokePlatformCodeDemos.Services
{
public enum DeviceOrientation
{
Undefined,
Landscape,
Portrait
}
}
下列範例顯示可用來擷取裝置方向的跨平臺 API:
namespace InvokePlatformCodeDemos.Services.PartialMethods
{
public partial class DeviceOrientationService
{
public partial DeviceOrientation GetOrientation();
}
}
部分類別名為 DeviceOrientationService
,其中包含名為 GetOrientation
的部分方法。 此類別的程式碼檔案必須位於 [平臺 ] 資料夾之外:
針對每個平臺實作 API
定義跨平臺 API 之後,必須藉由定義相同的部分類別和相同的部分方法簽章,同時提供方法實作,在目標的所有平臺上實作它。
平臺實作應該放在正確的 Platform 子資料夾中,以確保建置系統只會在針對特定平臺建置時嘗試建置平臺程式碼。 下表列出平臺實作的預設資料夾位置:
平台 | 資料夾 |
---|---|
Android | 平臺>Android |
iOS | 平臺>Ios |
MacCatalyst | 平臺>MacCatalyst |
Tizen | 平臺>Tizen |
Windows | 平臺>窗戶 |
重要
平臺實作必須位於定義跨平臺 API 的相同命名空間和相同類別中。
下列螢幕擷取畫面顯示 DeviceOrientationService
Android 和 iOS 資料夾中的類別:
或者,您可以根據您自己的檔案名和資料夾準則來執行多重目標,而不是使用 平臺 資料夾。 如需詳細資訊,請參閱 設定多重目標。
Android
下列範例顯示 Android 上 方法的實作 GetOrientation
:
using Android.Content;
using Android.Runtime;
using Android.Views;
namespace InvokePlatformCodeDemos.Services.PartialMethods;
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.PartialMethods;
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;
using InvokePlatformCodeDemos.Services.PartialMethods;
...
DeviceOrientationService deviceOrientationService = new DeviceOrientationService();
DeviceOrientation orientation = deviceOrientationService.GetOrientation();
在建置階段,建置系統將使用多重目標結合跨平臺部分類別與目標平臺的部分類別,並將其建置至應用程式套件。
設定多重目標
.NET MAUI 應用程式也可以根據您自己的檔案名和資料夾準則,以多重為目標。 這可讓您建構 .NET MAUI 應用程式專案,如此您就不需要將平臺程式碼放入 [平臺 ] 資料夾的子資料夾中。
例如,標準多重目標模式是在平臺程式碼的檔案名中包含平臺作為副檔名。 建置系統可以設定為根據下列模式,將跨平臺部分類別與平臺部分類別結合:
另一個標準多重目標模式是將平臺納入為資料夾名稱。 建置系統可以設定為根據下列模式,將跨平臺部分類別與平臺部分類別結合:
如需詳細資訊,請參閱 設定多重目標。