Xamarin. Mac mimarisi

Bu kılavuz, Xamarin. Mac ' i ve ilişkisini Objective-C düşük bir düzeyde araştırır. 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 daha sonra çalışma zamanında yerel koda derlenmiş olan ara dile (IL) derlemek için Xamarin 'in derleyicisini kullanır. Bu, çalışma zamanı ile yan yana çalışır Objective-C . her iki çalışma zamanı ortamı da UNIX benzeri bir çekirdeğin üzerinde çalışır, özellikle xnu, geliştiricilerin temeldeki yerel veya yönetilen sisteme erişmesine izin veren kullanıcı koduna çeşitli apı 'ler sunar.

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

Diagram showing a basic overview of the architectureMimariye

Yerel ve yönetilen kod

Xamarin için geliştirme yaparken Yerel ve yönetilen kod terimleri genellikle kullanılır. yönetilen kod, yürütülmesi .NET Framework ortak dil çalışma zamanı tarafından yönetilen veya Xamarin 'in case: Mono çalışma zamanı.

Yerel kod, belirli bir platformda (örneğin, Objective-C ya da bır ARM yongasında, hatta AOT derlenmiş kod) yerel olarak çalışacak koddur. Bu kılavuz, yönetilen kodunuzun yerel koda nasıl derlendiğini ve bir Xamarin. Mac uygulamasının nasıl çalıştığını açıklar ve derleme kullanımı aracılığıyla Apple Mac API 'Lerinin tam kullanımını, ayrıca öğesine erişimi de sağlar. NET 'in BCL ve C# gibi karmaşık bir dil.

Gereksinimler

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

  • MacOS Sierra (10,12) veya daha üstünü ç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ın çalıştırılması aşağıdaki sistem gereksinimlerine sahiptir:

  • 10,7 veya üzeri Mac OS X çalıştıran bir Mac.

Derleme

Herhangi bir Xamarin platform uygulamasını derlerken, mono C# (veya F #) derleyicisi çalışır ve C# ve F # kodunuzu Microsoft ara dili (MSIL veya Il) olarak derler. Xamarin. Mac daha sonra yerel kodu derlemek için çalışma zamanında tam zamanında (JIT) derleyici kullanır ve gerektiğinde doğru mimaride yürütmeye izin verir.

Bu, AOT derlemesini kullanan Xamarin. iOS 'a karşılık gelir. AOT derleyicisini kullanırken, içindeki tüm derlemeler ve tüm yöntemler derleme zamanında derlenir. JıT 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 katıştırılır (ve katıştırılmış monoolarak adlandırılır). Klasik Xamarin. Mac API 'sini kullanırken, uygulama bunun yerine System monokullanabilir, ancak bu Unified API desteklenmez. System mono, işletim sistemine yüklenmiş mono anlamına gelir. Uygulama başlatıldığında, Xamarin. Mac uygulaması bunu kullanacaktır.

Seçiciler

Xamarin ile, son hedefin sorunsuz bir kullanıcı deneyimi olduğundan emin olmak için bir araya getirilmesi gereken iki ayrı ekosistem vardır. İki çalışma alanının nasıl iletişim kurduğu bölümünde görüldü ve yerel Mac API 'Lerinin Xamarin 'te kullanılmasına izin veren ' Bindings ' terimini çok iyi duymuş olabilirsiniz. Bağlamaları bölümünde ayrıntılı olarak açıklanarak Objective-C binding documentation Xamarin. Mac 'in aynı anda nasıl çalıştığını keşfedelim.

İlk olarak, Objective-C seçici aracılığıyla yapılan C# ' de ortaya çıkarmak için bir yol olması gerekir. Seçici bir nesne veya sınıfa gönderilen iletidir. Objective-CBu, Objective-C işlevleri aracılığıyla yapılır. Seçicileri kullanma hakkında daha fazla bilgi için iOS Objective-C Selectors kılavuzuna bakın. Ayrıca, yönetilen kod ile Objective-C ilgili herhangi bir şeyi bilmez olması nedeniyle daha karmaşık olan, yönetilen kodu kullanıma sunmanız için bir yol olması gerekir Objective-C . Bu sorunu gidermek için, "Data-LinkType =" göreli yol ">bir kaydedici kullanıyoruz registrar . Bu, sonraki bölümde daha ayrıntılı olarak açıklanmıştır.

Registrar

Yukarıda belirtildiği gibi, tarafından registrar yönetilen kodu kullanıma sunan koddur Objective-C . Bunu, NSObject öğesinden türetilen her yönetilen sınıfın bir listesini oluşturarak yapar:

  • Var olan bir sınıfı sarmalanmayan tüm sınıflar için Objective-C , Objective-CObjective-C bir özniteliği olan tüm yönetilen üyeleri yansıtarak üyelere sahip yeni bir sınıf oluşturur [Export] .
  • Her bir amaç için uygulamalar – C üyesi, yansıtılmış yönetilen üyeyi çağırmak için kod otomatik olarak eklenir.

Aşağıdaki sözde kodda bunun nasıl yapıldığını gösteren bir örnek gösterilmektedir:

C# (yönetilen kod):

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

(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] ve [Export] ' registrar nin nesnenin açığa çıkarılması gerektiğini bildirmek için kullandığı öznitelikleri içerebilir Objective-C . Objective-CVarsayılan oluşturulan adın uygun olmaması durumunda oluşturulan sınıfın adını belirtmek için [Register] özniteliği kullanılır. NSObject 'ten türetilmiş tüm sınıflar otomatik olarak ile kaydedilir Objective-C . Gerekli [Export] özniteliği, oluşturulan sınıfta kullanılan seçici olan bir dize içeriyor Objective-C .

registrarsXamarin. Mac – Dynamic ve static içinde iki tür kullanılır:

  • Dynamic registrars : registrar Tüm Xamarin. Mac derlemeleri için varsayılan değer budur. Dinamik, registrar çalışma zamanında derlemeinizdeki tüm türlerin kaydını yapar. Çalışma zamanı API 'SI tarafından sunulan işlevleri kullanarak bunu yapar Objective-C . Dinamik registrar Bu nedenle daha yavaş bir başlangıç sağlar, ancak daha hızlı bir derleme süresi. Trampolines adlı yerel işlevler (genellikle C 'de), dinamik kullanılırken Yöntem uygulamaları olarak kullanılır registrars . Farklı mimarilerde farklılık gösterir.
  • Static registrars : statik, registrarObjective-C derleme sırasında, daha sonra statik bir kitaplığa derlenen ve çalıştırılabilir dosyaya bağlanan kodu oluşturur. Bu, daha hızlı bir başlangıç sağlar, ancak derleme zamanında daha uzun sürer.

Uygulama başlatma

Xamarin. Mac başlangıç mantığı, gömülü veya sistem Mono kullanılıp kullanıldığınıza göre farklılık gösterir. Xamarin. Mac Uygulama başlatma kodunu ve adımlarını görüntülemek için, Xamarin-macıos genel depoından başlatma üst bilgi dosyasına bakın.

Oluşturucu

Xamarin. Mac her Mac API için tanımlar içerir. Macıos GitHubdeposunda bunlardan herhangi birine göz atabilirsiniz. Bu tanımlar, öznitelikleri olan arabirimleri ve gerekli tüm yöntemleri ve özellikleri içerir. Örneğin, aşağıdaki kod Appkit adalanında bir nsbox tanımlamak için kullanılır. Çeşitli yöntemlere ve özelliklere 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);

    …

}

bmacXamarin. Mac ' de çağrılan 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 kodu çağırabilmeyebilir Objective-C . Daha sonra Oluşturucu geçici derlemeyi okur ve çalışma zamanında kullanılabilecek C# kodu oluşturur. Bunun nedeni, örneğin, tanım. cs dosyanıza rastgele bir öznitelik eklerseniz, bu, outputcode 'da gösterilmez. Oluşturucu hakkında bilgi sahibi değildir ve bu nedenle, bmac Çıkış yapmak için geçici derlemede arama yapmaz.

Xamarin.Mac.dll oluşturulduktan sonra, paketleyicisi, mmp tüm bileşenlerini bir araya görür.

Yüksek düzeyde, aşağıdaki görevleri yürüterek buna erişir:

  • Uygulama paketi yapısı oluşturun.
  • Yönetilen derlemelerinize kopyalayın.
  • Bağlama etkinse, kullanılmayan parçaları kaldırarak derlemelerinizi iyileştirmek için yönetilen bağlayıcıyı çalıştırın.
  • Başlatıcı kodunda bağlantı kurarak, statik modda olan kodla birlikte bir başlatıcı uygulaması oluşturun registrar .

Bu daha sonra Kullanıcı kodunu, Xamarin.Mac.dll başvuran bir derlemede ve mmp bir paket haline getirmek için çalışan Kullanıcı oluşturma işleminin bir parçası olarak çalıştırılır

Bağlayıcı ve nasıl kullanıldığı hakkında daha ayrıntılı bilgi için iOS bağlayıcı Kılavuzu ' na bakın.

Özet

Bu kılavuz, Xamarin. Mac uygulamalarının derlenmesi, Xamarin. Mac ve ile ilişkilerini araştırıyor Objective-C .