Aufrufen von Plattformcode
In Situationen, in denen .NET Multi-Platform App UI (.NET MAUI) keine APIs für den Zugriff auf bestimmte Plattform-APIs bereitstellt, können Sie Ihren eigenen Code schreiben, um auf die erforderlichen Plattform-APIs zuzugreifen. Dies erfordert Kenntnisse der iOS- und MacCatalyst-APIs von Apple, googles Android-APIs und microsofts Windows App SDK APIs.
Plattformcode kann von plattformübergreifendem Code mithilfe einer bedingten Kompilierung oder mithilfe von Teilklassen und Teilmethoden aufgerufen werden.
Bedingte Kompilierung
Plattformcode kann von plattformübergreifendem Code aufgerufen werden, indem die bedingte Kompilierung verwendet wird, um auf verschiedene Plattformen zu abzielen.
Das folgende Beispiel zeigt die Aufzählung, die verwendet wird, um die DeviceOrientation
Ausrichtung Ihres Geräts anzugeben:
namespace InvokePlatformCodeDemos.Services
{
public enum DeviceOrientation
{
Undefined,
Landscape,
Portrait
}
}
Das Abrufen der Ausrichtung Ihres Geräts erfordert das Schreiben von Plattformcode. Dies kann erreicht werden, indem sie eine Methode schreiben, die die bedingte Kompilierung verwendet, um auf verschiedene Plattformen zu abzielen:
#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
}
}
}
In diesem Beispiel werden Plattformimplementierungen der GetOrientation
Methode für Android und iOS bereitgestellt. Auf anderen Plattformen DeviceOrientation.Undefined
wird zurückgegeben. Alternativ können Sie anstelle der Rückgabe DeviceOrientation.Undefined
eine PlatformNotSupportedException
Methode auslösen, die die Plattformen angibt, für die Implementierungen bereitgestellt werden:
throw new PlatformNotSupportedException("GetOrientation is only supported on Android and iOS.");
Die DeviceOrientationService.GetOrientation
Methode kann dann aus plattformübergreifendem Code aufgerufen werden, indem eine Objektinstanz erstellt und dessen Vorgang aufgerufen wird:
using InvokePlatformCodeDemos.Services;
using InvokePlatformCodeDemos.Services.ConditionalCompilation;
...
DeviceOrientationService deviceOrientationService = new DeviceOrientationService();
DeviceOrientation orientation = deviceOrientationService.GetOrientation();
Beim Buildvorgang verwendet das Buildsystem bedingte Kompilierung zum Ziel von Android- und iOS-Plattformcode auf die richtige Plattform.
Weitere Informationen zur bedingten Kompilierung finden Sie unter "Bedingte Kompilierung".
Teilklassen und Methoden
Ein .NET MAUI-App-Projekt enthält einen Ordner " Plattformen " mit jedem untergeordneten Ordner, der eine Plattform darstellt, auf die .NET MAUI zielt:
Die Ordner für jede Zielplattform enthalten plattformspezifischen Code, der die App auf jeder Plattform startet, sowie alle zusätzlichen Plattformcodes, die Sie hinzufügen. Zum Buildzeitpunkt enthält das Buildsystem nur den Code aus jedem Ordner beim Erstellen für diese bestimmte Plattform. Wenn Sie beispielsweise für Android erstellen, werden die Dateien imAndroid-Ordner "Plattformen" in das App-Paket integriert, aber die Dateien in den anderenPlattformen-Ordnern> werden nicht angezeigt. Dieser Ansatz verwendet ein Feature namens Multi-Targeting, um mehrere Plattformen aus einem einzigen Projekt zu erreichen.
Multi-Targeting kann mit Teilklassen und Teilmethoden kombiniert werden, um Plattformfunktionen aus plattformübergreifendem Code aufzurufen. Der Prozess für die Vorgehensweise besteht darin, folgendes zu tun:
- Definieren Sie die plattformübergreifende API als Teilklasse, die Teilmethodensignaturen für alle Vorgänge definiert, die Sie auf jeder Plattform aufrufen möchten. Weitere Informationen finden Sie unter Definieren der plattformübergreifenden API.
- Implementieren Sie die plattformübergreifende API pro Plattform, indem Sie dieselbe Teilklasse und die gleichen Teilmethodensignaturen definieren und auch die Methodenimplementierungen bereitstellen. Weitere Informationen finden Sie unter Implementieren der API pro Plattform.
- Rufen Sie die plattformübergreifende API auf, indem Sie eine Instanz der Teilklasse erstellen und ihre Methoden wie erforderlich aufrufen. Weitere Informationen finden Sie unter Aufrufen der plattformübergreifenden API.
Definieren der plattformübergreifenden API
Zum Aufrufen von Plattformcode aus plattformübergreifendem Code besteht der erste Schritt darin, die plattformübergreifende API als Teilklasse zu definieren, die Teilmethodensignaturen für alle Vorgänge definiert, die Sie auf jeder Plattform aufrufen möchten.
Das folgende Beispiel zeigt die Aufzählung, die verwendet wird, um die DeviceOrientation
Ausrichtung Ihres Geräts anzugeben:
namespace InvokePlatformCodeDemos.Services
{
public enum DeviceOrientation
{
Undefined,
Landscape,
Portrait
}
}
Das folgende Beispiel zeigt eine plattformübergreifende API, die zum Abrufen der Ausrichtung eines Geräts verwendet werden kann:
namespace InvokePlatformCodeDemos.Services.PartialMethods
{
public partial class DeviceOrientationService
{
public partial DeviceOrientation GetOrientation();
}
}
Die Teilklasse wird benannt, die eine Teilmethode mit dem Namen DeviceOrientationService
GetOrientation
". Die Codedatei für diese Klasse muss außerhalb des Ordners "Plattformen " sein:
Implementieren der API pro Plattform
Nachdem Sie die plattformübergreifende API definiert haben, muss sie auf allen Plattformen implementiert werden, die Sie anzielen, indem Sie dieselbe Teilklasse und die gleichen Teilmethodensignaturen definieren und auch die Methodenimplementierungen bereitstellen.
Plattformimplementierungen sollten in den richtigen untergeordneten Ordnern von Plattformen platziert werden, um sicherzustellen, dass das Buildsystem nur versucht, Plattformcode zu erstellen, wenn sie für die bestimmte Plattform erstellt werden. In der folgenden Tabelle sind die Standardordnerspeicherorte für Plattformimplementierungen aufgeführt:
Plattform | Ordner |
---|---|
Android | Plattformen>Android |
iOS | Plattformen>Ios |
MacCatalyst | Plattformen>MacCatalyst |
Tizen | Plattformen>Tizen |
Windows | Plattformen>Fenster |
Wichtig
Plattformimplementierungen müssen sich im gleichen Namespace und derselben Klasse befinden, in der die plattformübergreifende API definiert wurde.
Der folgende Screenshot zeigt die DeviceOrientationService
Klassen in den Ordnern Android und iOS :
Alternativ können multi-targeting basierend auf Ihren eigenen Dateinamen- und Ordnerkriterien ausgeführt werden, anstatt die Plattformen-Ordner zu verwenden. Weitere Informationen finden Sie unter "Konfigurieren von Multi-Targeting".
Android
Im folgenden Beispiel wird die Implementierung der GetOrientation
Methode auf Android gezeigt:
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
Im folgenden Beispiel wird die Implementierung der GetOrientation
Methode auf iOS gezeigt:
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;
}
}
Aufrufen der plattformübergreifenden API
Nach der Bereitstellung der Plattformimplementierungen kann die API aus plattformübergreifendem Code aufgerufen werden, indem sie eine Objektinstanz erstellen und den Vorgang aufrufen:
using InvokePlatformCodeDemos.Services;
using InvokePlatformCodeDemos.Services.PartialMethods;
...
DeviceOrientationService deviceOrientationService = new DeviceOrientationService();
DeviceOrientation orientation = deviceOrientationService.GetOrientation();
Zum Buildzeitpunkt wird das Buildsystem multi-Targeting verwenden, um die plattformübergreifende Teilklasse mit der Teilklasse für die Zielplattform zu kombinieren und in das App-Paket zu integrieren.
Konfigurieren von Multi-Targeting
.NET MAUI-Apps können auch auf Grundlage Ihrer eigenen Dateinamen- und Ordnerkriterien multizieliv sein. Dadurch können Sie Ihr .NET MAUI-App-Projekt so strukturieren, dass Sie Den Plattformcode nicht in untergeordnete Ordner des Ordners "Plattformen " platzieren müssen.
Beispielsweise soll ein Standardmuster für multi-Targeting die Plattform als Erweiterung im Dateinamen für den Plattformcode einschließen. Das Buildsystem kann konfiguriert werden, um plattformübergreifende Teilklassen mit plattformübergreifenden Teilklassen basierend auf diesem Muster zu kombinieren:
Ein weiteres standardbasiertes Multi-Targeting-Muster besteht darin, die Plattform als Ordnernamen einzuschließen. Das Buildsystem kann konfiguriert werden, um plattformübergreifende Teilklassen mit plattformübergreifenden Teilklassen basierend auf diesem Muster zu kombinieren:
Weitere Informationen finden Sie unter "Konfigurieren von Multi-Targeting".