Platform kodunu çağırma

Örneğe göz atın. Örneğe göz atın

.NET Çok Platformlu Uygulama Kullanıcı Arabiriminin (.NET MAUI) belirli platform API'lerine erişmek için herhangi bir API sağlamadığı durumlarda, gerekli platform API'lerine erişmek için kendi kodunuzu yazabilirsiniz. Bunun için Apple'ın iOS ve MacCatalyst API'leri, Google'ın Android API'leri ve Microsoft'un Windows Uygulama SDK'sı API'leri hakkında bilgi sahibi olunması gerekir.

Platform kodu, koşullu derleme kullanılarak platformlar arası koddan veya kısmi sınıflar ve kısmi yöntemler kullanılarak çağrılabilir.

Koşullu derleme

Platform kodu, farklı platformları hedeflemek için koşullu derleme kullanılarak platformlar arası koddan çağrılabilir.

Aşağıdaki örnek, cihazınızın yönlendirmesini DeviceOrientation belirtmek için kullanılacak numaralandırmayı gösterir:

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

Cihazınızın yönlendirmesini almak için platform kodu yazmanız gerekir. Bu, farklı platformları hedeflemek için koşullu derleme kullanan bir yöntem yazılarak gerçekleştirilebilir:

#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
        }
    }
}

Bu örnekte, yöntemin GetOrientation platform uygulamaları Android ve iOS için sağlanır. Diğer platformlarda DeviceOrientation.Undefined döndürülür. Alternatif olarak, DeviceOrientation.Undefined döndürmek yerine, uygulamaların sağlandığı platformları belirten bir PlatformNotSupportedException fırlatabilirsiniz.

throw new PlatformNotSupportedException("GetOrientation is only supported on Android and iOS.");

Ardından DeviceOrientationService.GetOrientation yöntem, bir nesne örneği oluşturup işlemini çağırarak platformlar arası koddan çağrılabilir:

using InvokePlatformCodeDemos.Services;
using InvokePlatformCodeDemos.Services.ConditionalCompilation;
...

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

Derleme zamanında derleme sistemi, Android ve iOS platform kodunu doğru platforma hedeflemek için koşullu derleme kullanır.

Koşullu derleme hakkında daha fazla bilgi için bkz. Koşullu derleme.

Kısmi sınıflar ve yöntemler

.NET MAUI uygulama projesi, .NET MAUI'nin hedefleyebilecekleri bir platformu temsil eden her alt klasörün bulunduğu bir Platformlar klasörü içerir:

Platform klasörleri ekran görüntüsü.

Her hedef platformun klasörleri, uygulamayı her platformda başlatan platforma özgü kodun yanı sıra eklediğiniz tüm ek platform kodlarını içerir. Derleme zamanında, derleme sistemi yalnızca belirli bir platform için derleme yaparken her klasörden gelen kodu içerir. Örneğin, Android için derleme yaptığınızda Platformlar>Android klasöründeki dosyalar uygulama paketinde yerleşik olarak bulunur, ancak diğer Platformlar klasörlerindeki dosyalar oluşturulmaz. Bu yaklaşım, tek bir projeden birden çok platformu hedeflemek için çoklu hedefleme adlı bir özellik kullanır.

Çoklu hedefleme, platformlar arası koddan platform işlevselliğini çağırmak için kısmi sınıflar ve kısmi yöntemlerle birleştirilebilir. Bunu yapma işlemi şu şekildedir:

  1. Platformlar arası API'yi, her platformda çağırmak istediğiniz işlemler için kısmi yöntem imzalarını tanımlayan kısmi bir sınıf olarak tanımlayın. Daha fazla bilgi için bkz. Platformlar arası API'yi tanımlama.
  2. Aynı kısmi sınıfı ve aynı kısmi yöntem imzalarını tanımlayıp yöntem uygulamalarını sağlayarak platform başına platformlar arası API'yi uygulayın. Daha fazla bilgi için bkz. Platform başına API'yi uygulama.
  3. Kısmi sınıfın bir örneğini oluşturup yöntemlerini gerektiği gibi çağırarak platformlar arası API'yi çağırın. Daha fazla bilgi için bkz. Platformlar arası API'yi çağırma.

Platformlar arası API'yi tanımlama

Platformlar arası koddan platform kodunu çağırmak için ilk adım, platformlar arası API'yi her platformda çağırmak istediğiniz işlemler için kısmi yöntem imzalarını tanımlayan kısmi bir sınıf olarak tanımlamaktır.

Aşağıdaki örnek, cihazınızın yönlendirmesini DeviceOrientation belirtmek için kullanılacak numaralandırmayı gösterir:

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

Aşağıdaki örnekte, bir cihazın yönlendirmesini almak için kullanılabilecek bir platformlar arası API gösterilmektedir:

namespace InvokePlatformCodeDemos.Services.PartialMethods
{
    public partial class DeviceOrientationService
    {
        public partial DeviceOrientation GetOrientation();
    }
}

Kısmi sınıf DeviceOrientationService adlıdır ve GetOrientation adlı bir kısmi yöntem içerir. Bu sınıfın kod dosyası Platformlar klasörünün dışında olmalıdır:

Hizmetler klasörü ekran görüntüsünde DeviceOrientationService sınıfı.

Platform başına API'yi uygulama

Platformlar arası API'yi tanımladıktan sonra, aynı kısmi sınıfı ve aynı kısmi yöntem imzalarını tanımlayarak hedeflediğiniz tüm platformlarda uygulanmalıdır ve yöntem uygulamaları da sağlanmalıdır.

Derleme sisteminin yalnızca belirli bir platform için derleme yaparken platform kodu oluşturmaya çalıştığından emin olmak için platform uygulamaları doğru Platform alt klasörlerine yerleştirilmelidir. Aşağıdaki tabloda platform uygulamaları için varsayılan klasör konumları listelenir:

Platform Klasör
Android Platform>Android
Ios Platform>Ios
MacCatalyst Platformlar>MacCatalyst
Tizen Platformlar>Tizen
Windows Platform>Windows

Önemli

Platform uygulamaları, platformlar arası API'nin tanımlandığı ad alanında ve aynı sınıfta olmalıdır.

Aşağıdaki ekran görüntüsünde DeviceOrientationServiceAndroid ve iOS klasörlerindeki sınıflar gösterilmektedir:

Platformlar klasöründeki DeviceOrientationService sınıfları ekran görüntüsü.

Alternatif olarak çoklu hedefleme, Platformlar klasörlerini kullanmak yerine kendi dosya adınıza ve klasör ölçütlerinize göre gerçekleştirilebilir. Daha fazla bilgi için bkz. Çoklu hedeflemeyi yapılandırma.

Android

Aşağıdaki örnekte, Android'de yönteminin GetOrientation uygulanması gösterilmektedir:

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

Aşağıdaki örnekte iOS'ta yönteminin GetOrientation uygulanması gösterilmektedir:

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;
    }
}

Platformlar arası API'yi çağırma

Platform uygulamaları sağlandıktan sonra, API bir nesne örneği oluşturup işlemini çağırarak platformlar arası koddan çağrılabilir:

using InvokePlatformCodeDemos.Services;
using InvokePlatformCodeDemos.Services.PartialMethods;
...

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

Derleme anında derleme sistemi, platformlar arası kısmi sınıfı hedef platformun kısmi sınıfıyla birleştirmek için çok hedefli yapılandırmayı kullanacak ve bu birleştirilmiş sınıfı uygulama paketine derleyecektir.

Çoklu hedeflemeyi yapılandırma

.NET MAUI uygulamaları, kendi dosya adınıza ve klasör ölçütlerinize göre de çok hedefli olabilir. Bu, platform kodunuzu Platformlar klasörünün alt klasörlerine yerleştirmeniz gerekmeyecek şekilde .NET MAUI uygulama projenizi yapılandırmanıza olanak tanır.

Örneğin, standart bir çoklu hedefleme yöntemi, platform kodu için platformu dosya adına uzantı olarak eklemektir. Yapı sistemi, bu desene göre platformlar arası kısmi sınıfları platform kısmi sınıflarla birleştirmek için yapılandırılabilir:

Dosya adı tabanlı çoklu hedefleme kullanan DeviceOrientationService sınıfları.

Başka bir standart çoklu hedefleme düzeni, platformu klasör adı olarak eklemektir. Derleme sistemi, bu kalıba göre platformlar arası kısmi sınıfları platforma özgü kısmi sınıflarla birleştirmek için yapılandırılabilir.

Klasör tabanlı çoklu hedefleme kullanan DeviceOrientationService sınıfları.

Daha fazla bilgi için bkz. Çoklu hedeflemeyi yapılandırma.