Aracılığıyla paylaş


Platform kodunu çağırma

Örne göz atın. Örne göz atma

.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 yazılması 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, android ve iOS için yönteminin GetOrientation platform uygulamaları sağlanır. Diğer platformlarda DeviceOrientation.Undefined döndürülür. Alternatif olarak, döndürmek DeviceOrientation.Undefined yerine, uygulamaların sağlandığı platformları belirten bir PlatformNotSupportedException oluşturabilirsiniz:

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

Yöntem DeviceOrientationService.GetOrientation daha sonra 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 hedefleyebileceği 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 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şımda, tek bir projeden birden çok platformu hedeflemek için çoklu hedefleme adı verilen bir özellik kullanılı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. Api'yi platform başına 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, adlı DeviceOrientationServicekısmi bir yöntem içeren adlı GetOrientationsınıfıdır. 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 uygulama

Platformlar arası API tanımlandıktan sonra, aynı kısmi sınıfı ve aynı kısmi yöntem imzalarını tanımlayıp yöntem uygulamalarını sağlayarak hedeflediğiniz tüm platformlarda uygulanmalı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 Platformlar alt klasörlerine yerleştirilmelidir. Aşağıdaki tabloda platform uygulamaları için varsayılan klasör konumları listelemektedir:

Platform Klasör
Android Platform>Android
iOS Platform>Ios
MacCatalyst Platform>MacCatalyst
Tizen Platform>Tizen dili
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ü ekran görüntüsünde DeviceOrientationService sınıfları.

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şlemi çağrılarak platformlar arası koddan çağrılabilir:

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

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

Derleme zamanında derleme sistemi çoklu hedefleme kullanarak platformlar arası kısmi sınıfı hedef platformun kısmi sınıfıyla birleştirir ve uygulama paketinde derler.

Ç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ızı sağlar.

Örneğin, standart bir çoklu hedefleme düzeni, platform kodunun dosya adına bir uzantı olarak platformu dahil etmektir. Derleme sistemi, platformlar arası kısmi sınıfları bu desene göre platform kısmi sınıfları ile birleştirecek şekilde yapılandırılabilir:

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

Bir diğer standart çoklu hedefleme düzeni de platformu klasör adı olarak eklemektir. Derleme sistemi, platformlar arası kısmi sınıfları bu desene göre platform kısmi sınıfları ile birleştirecek şekilde 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.