Xamarin.Mac mimarisi

Bu kılavuzda Xamarin.Mac ve alt düzeydeki ilişkisi Objective-C incelenmektedir. Derleme, seçiciler registrars, , uygulama başlatma ve oluşturucu gibi kavramları açıklar.

Genel bakış

Xamarin.Mac uygulamaları Mono yürütme ortamında çalışır ve Xamarin'in derleyicisini kullanarak Ara Dil 'e (IL) kadar derleyin. Bu, tam zamanında (JIT) çalışma zamanında yerel koda derlenmiştir. Bu, Çalışma Zamanı ile Objective-C yan yana çalışır. Her iki çalışma zamanı ortamı da UNIX benzeri bir çekirdek üzerinde( özellikle XNU) çalışır ve geliştiricilerin temel alınan yerel veya yönetilen sisteme erişmesine olanak sağlayan kullanıcı kodunda çeşitli API'leri kullanıma sunar.

Aşağıdaki diyagramda bu mimariye temel bir genel bakış gösterilmektedir:

Diagram showing a basic overview of the architecture

Yerel ve yönetilen kod

Xamarin için geliştirme yaparken genellikle yerel ve yönetilen kod terimleri kullanılır. Yönetilen kod, yürütmesinin .NET Framework Ortak Dil Çalışma Zamanı tarafından veya Xamarin örneğinde mono çalışma zamanı tarafından yönetilen koddur.

Yerel kod, belirli bir platformda yerel olarak çalışacak koddur (örneğin, Objective-C ARM yongasında AOT derlenmiş kod). Bu kılavuz, yönetilen kodunuzun yerel koda nasıl derlenmiş olduğunu inceler ve bir Xamarin.Mac uygulamasının nasıl çalıştığını açıklar ve bağlamaları kullanarak Apple'ın Mac API'lerinden tam olarak yararlanır ve erişimi olur. NET'in BCL'si ve C# gibi gelişmiş bir dil.

Gereksinimler

Xamarin.Mac ile bir macOS uygulaması geliştirmek için aşağıdakiler gereklidir:

  • macOS Sierra (10.12) veya üzerini çalıştıran bir Mac.
  • Xcode'un en son sürümü (App Store'dan yüklenir)
  • Xamarin.Mac ve Mac için Visual Studio'nin en son sürümü

Xamarin.Mac ile oluşturulan Mac uygulamalarını çalıştırmak aşağıdaki sistem gereksinimlerine sahiptir:

  • Mac OS X 10.7 veya üzerini çalıştıran bir Mac.

Derleme

Herhangi bir Xamarin platformu uygulamasını derlediğinizde Mono C# (veya F#) derleyicisi çalışır ve C# ve F# kodunuzu Microsoft Ara Dili'ne (MSIL veya IL) derler. Xamarin.Mac daha sonra yerel kodu derlemek için çalışma zamanında Just in Time (JIT) derleyicisini kullanarak gerektiği gibi doğru mimaride yürütmeye olanak tanır.

Bu, AOT derlemesi kullanan Xamarin.iOS'un aksinedir. AOT derleyicisi kullanılırken, derleme zamanında tüm derlemeler ve içindeki tüm yöntemler derlenir. JIT ile derleme yalnızca yürütülen yöntemler için isteğe bağlı olarak gerçekleşir.

Xamarin.Mac uygulamalarıyla Mono genellikle uygulama paketine eklenir (ve Embedded Mono olarak adlandırılır). Klasik Xamarin.Mac API'sini kullanırken uygulama bunun yerine System Mono kullanabilir, ancak Bu, Birleşik API'de desteklenmez. System Mono, işletim sisteminde yüklü olan Mono'ya başvurur. Uygulama başlatıldığında, Xamarin.Mac uygulaması bunu kullanır.

Seçiciler

Xamarin ile, son hedefin sorunsuz bir kullanıcı deneyimi olduğundan emin olmak için mümkün olduğunca rahat görünmesi için bir araya getirmemiz gereken .NET ve Apple adlı iki ayrı ekosistemimiz vardır. Yukarıdaki bölümde iki çalışma zamanının nasıl iletişim kurdığını gördük ve yerel Mac API'lerinin Xamarin'de kullanılmasını sağlayan 'bağlamalar' terimini çok iyi duymuş olabilirsiniz. Bağlamalar bağlama belgelerinde Objective-Cayrıntılı olarak açıklanmıştır. Şimdilik Xamarin.Mac'in arka planda nasıl çalıştığını inceleyelim.

İlk olarak, Seçiciler aracılığıyla gerçekleştirilen C# ile kullanıma sunmanın Objective-C bir yolu olmalıdır. Seçici, bir nesneye veya sınıfa gönderilen bir iletidir. Bu Objective-C işlem, objc_msgSend işlevleri aracılığıyla yapılır. Seçicileri kullanma hakkında daha fazla bilgi için iOS Objective-C Seçiciler kılavuzuna bakın. Yönetilen kod hakkında hiçbir şey bilmemesi nedeniyle Objective-C daha karmaşık olan yönetilen kodu Objective-Ciçin kullanıma sunmanın bir yolu da olmalıdır. Bu sorunu çözmek için bir registrarkullanırız. Bu, sonraki bölümde daha ayrıntılı olarak açıklanmıştır.

Registrar

Yukarıda belirtildiği gibi, registrar yönetilen kodu için Objective-Ckullanıma sunan koddur. Bunu, NSObject'ten türetilen her yönetilen sınıfın listesini oluşturarak yapar:

  • Mevcut Objective-C bir sınıfı sarmalamayan tüm sınıflar için, bir özniteliği olan tüm yönetilen üyeleri yansıtan üyeler ile Objective-C yeni Objective-C bir [Export] sınıf oluşturur.
  • Her Objective–C üyesinin uygulamalarına, yansıtılmış yönetilen üyeyi çağırmak için kod otomatik olarak eklenir.

Aşağıdaki sahte kod, bunun nasıl yapıldığını gösteren bir örnek gösterir:

C# (yönetilen kod):

class MyViewController : UIViewController{
    [Export ("myFunc")]
    public void MyFunc ()
    {
    }
 }

Objective-C (yerel kod):

@interface MyViewController : UIViewController
 - (void)myFunc;
@end

@implementation MyViewController
- (void)myFunc {
    // Code to call the managed C# MyFunc method in MyViewController
}
@end

Yönetilen kod, [Register] nesnesinin 'e açık olması gerektiğini bilmek için kullandığı ve [Export]registrar özniteliklerini Objective-Ciçerebilir. Varsayılan oluşturulan adın uygun olmaması durumunda oluşturulan Objective-C sınıfın adını belirtmek için [Register] özniteliği kullanılır. NSObject'ten türetilen tüm sınıflar ile Objective-Cotomatik olarak kaydedilir. Gerekli [Export] özniteliği, oluşturulan Objective-C sınıfta kullanılan seçici olan bir dize içerir.

Xamarin.Mac'te kullanılan iki tür vardır registrars : dinamik ve statik:

  • Dinamik registrars : Bu, tüm Xamarin.Mac derlemeleri için varsayılandır registrar . Dinamik registrar , çalışma zamanında derlemenizdeki tüm türlerin kaydını yapar. Bunu, 'nin çalışma zamanı API'si tarafından Objective-Csağlanan işlevleri kullanarak yapar. Bu nedenle dinamik registrar , daha yavaş bir başlangıç, ancak daha hızlı bir derleme süresine sahiptir. Yerel işlevler (genellikle C dilindedir), trambolinler olarak adlandırılır, dinamik registrarskullanılırken yöntem uygulamaları olarak kullanılır. Bunlar farklı mimariler arasında farklılık gösterir.
  • Static registrars : Statik registrar , derleme sırasında kod oluşturur Objective-C ve bu kod daha sonra statik bir kitaplıkta derlenip yürütülebilir dosyaya bağlanır. Bu, daha hızlı bir başlangıç sağlar, ancak derleme süresi boyunca daha uzun sürer.

Uygulama başlatma

Xamarin.Mac başlangıç mantığı, katıştırılmış mı yoksa sistem Mono mu kullanıldığına bağlı olarak farklılık gösterir. Xamarin.Mac uygulamasını başlatma kodunu ve adımlarını görüntülemek için xamarin-macios genel deposundaki başlatma üst bilgisi dosyasına bakın.

Oluşturucu

Xamarin.Mac, her Mac API için tanımlar içerir. MaciOS github deposunda bunlardan herhangi birine göz atabilirsiniz. Bu tanımlar, öznitelikleri olan arabirimlerin yanı sıra gerekli yöntem ve özellikleri içerir. Örneğin, AppKit ad alanında bir NSBox tanımlamak için aşağıdaki kod kullanılır. Bunun bir dizi yöntem ve özelliğe sahip bir arabirim olduğuna dikkat edin:

[BaseType (typeof (NSView))]
public interface NSBox {

    …

    [Export ("borderRect")]
    CGRect BorderRect { get; }

    [Export ("titleRect")]
    CGRect TitleRect { get; }

    [Export ("titleCell")]
    NSObject TitleCell { get; }

    [Export ("sizeToFit")]
    void SizeToFit ();

    [Export ("contentViewMargins")]
    CGSize ContentViewMargins { get; set; }

    [Export ("setFrameFromContentFrame:")]
    void SetFrameFromContentFrame (CGRect contentFrame);

    …

}

Xamarin.Mac'te adı verilen bmac Oluşturucu, bu tanım dosyalarını alır ve bunları geçici bir derlemede derlemek için .NET araçlarını kullanır. Ancak, bu geçici derleme kod çağırmak Objective-C için kullanılamaz. Oluşturucu daha sonra geçici derlemeyi okur ve çalışma zamanında kullanılabilecek C# kodu oluşturur. Bu nedenle, örneğin, tanım .cs dosyanıza rastgele bir öznitelik eklerseniz, çıkış kodunda gösterilmez. Oluşturucu bunu bilmez ve bu nedenle bmac bunu çıkış yapmak için geçici derlemede aramasını bilmez.

Xamarin.Mac.dll oluşturulduktan sonra paketleyici, mmptüm bileşenleri birlikte paketler.

Yüksek düzeyde, aşağıdaki görevleri yürüterek bunu başarıyor:

  • Bir uygulama paketi yapısı oluşturun.
  • Yönetilen derlemelerinizde kopyalayın.
  • Bağlama etkinleştirildiyse, kullanılmayan parçaları kaldırarak derlemelerinizi iyileştirmek için yönetilen bağlayıcıyı çalıştırın.
  • Statik moddaysa kodla birlikte, başlatıcı kodunda registrar bağlantı oluşturan bir başlatıcı uygulaması oluşturun.

Daha sonra bu, kullanıcı kodunu başvurunun Xamarin.Mac.dll bir derlemeye derleyen ve bunu bir paket haline getirmek için çalıştıran kullanıcı derleme işleminin bir parçası olarak çalıştırılır mmp

Bağlayıcı ve nasıl kullanıldığı hakkında daha ayrıntılı bilgi için iOS Bağlayıcı kılavuzuna bakın.

Özet

Bu kılavuzda Xamarin.Mac uygulamalarının derlenmesi incelenmiş ve Xamarin.Mac ile ilişkisi Objective-Ckeşfedildi.