Aracılığıyla paylaş


Xamarin.Mac nasıl çalışır?

Çoğu zaman geliştiricinin Xamarin.Mac'in iç "sihri" konusunda endişelenmesi gerekmez, ancak işlerin arka planda nasıl çalıştığını kabaca anlamak hem mevcut belgeleri C# merceğiyle yorumlamaya hem de ortaya çıktığında hata ayıklama sorunlarına yardımcı olur.

Xamarin.Mac'te bir uygulama iki dünyaya köprü oluşturur: Objective-C Yerel sınıfların (NSString, vb NSApplication.) örneklerini içeren tabanlı çalışma zamanı vardır ve yönetilen sınıfların (System.String, vb HttpClient.) örneklerini içeren C# çalışma zamanı vardır. Bu iki dünya arasında Xamarin.Mac iki yönlü bir köprü oluşturur; böylece bir uygulama içindeki yöntemleri (seçiciler) Objective-C NSApplication.Initçağırabilir ve Objective-C uygulamanın C# yöntemlerini geri çağırabilir (uygulama temsilcisindeki yöntemler gibi). Genel olarak, içine Objective-C çağrıları P/Invokes ve Xamarin tarafından sunulan bazı çalışma zamanı kodu aracılığıyla saydam olarak işlenir.

C# sınıflarını / yöntemlerini kullanıma sunar Objective-C

Ancak, bir uygulamanın C# nesnelerine geri çağrı yapmak için Objective-C , bunu anlayabilecek bir şekilde Objective-C kullanıma sunulmaları gerekir. Bu işlem ve Export öznitelikleri aracılığıyla Register yapılır. Aşağıdaki örneğe göz atın:

[Register ("MyClass")]
public class MyClass : NSObject
{
   [Export ("init")]
   public MyClass ()
   {
   }

   [Export ("run")]
   public void Run ()
   {
   }
}

Bu örnekte, Objective-C çalışma zamanı artık ve runadlı seçicilerle adlı MyClass init bir sınıf hakkında bilgi edinecektir.

Çoğu durumda, bir uygulamanın aldığı çoğu geri çağırma sınıflarda (, AppDelegateDataSourcesDelegatesgibi) geçersiz kılınan yöntemlerle veya API'lere base geçirilen eylemlerde olduğundan, bu geliştiricinin yoksayabileceği bir uygulama ayrıntısıdır. Tüm bu durumlarda, Export C# kodunda öznitelikler gerekli değildir.

Oluşturucu çalıştırması

Çoğu durumda geliştiricinin uygulamanın C# sınıfları oluşturma API'sini çalışma zamanına Objective-C sunması gerekir; böylece Görsel Taslak veya XIB dosyalarında çağrıldığında olduğu gibi yerlerden örneklenebilir. Xamarin.Mac uygulamalarında kullanılan en yaygın beş oluşturucu şunlardır:

// Called when created from unmanaged code
public CustomView (IntPtr handle) : base (handle)
{
   Initialize ();
}

// Called when created directly from a XIB file
[Export ("initWithCoder:")]
public CustomView (NSCoder coder) : base (coder)
{
   Initialize ();
}

// Called from C# to instance NSView with a Frame (initWithFrame)
public CustomView (CGRect frame) : base (frame)
{
}

// Called from C# to instance NSView without setting the frame (init)
public CustomView () : base ()
{
}

// This is a special case constructor that you call on a derived class when the derived called has an [Export] constructor.
// For example, if you call init on NSString then you don’t want to call init on NSObject.
public CustomView () : base (NSObjectFlag.Empty)
{
}

Genel olarak, geliştirici özel gibi NSViews bazı türleri oluştururken oluşturulan ve NSCoder oluşturucularını tek başına bırakmalıdırIntPtr. Xamarin.Mac'in çalışma Objective-C zamanı isteğine yanıt olarak bu oluşturuculardan birini çağırması gerekiyorsa ve bunu kaldırdıysanız, uygulama yerel kod içinde kilitlenir ve sorunu tam olarak bulmak zor olabilir.

Bellek yönetimi ve döngüler

Xamarin.Mac'te bellek yönetimi, Xamarin.iOS'a çok benzer. Ayrıca, bu belgenin kapsamının dışında olan karmaşık bir konudur. Lütfen Bellek ve Performans için En İyi Yöntemler'i okuyun.

Önceden derleme

Genellikle,.NET uygulamaları oluşturulduklarında makine koduna derlenmez, bunun yerine uygulama başlatıldığında makine koduna Tam Zamanında (JIT) derlenen IL kodu adlı bir ara katmanda derlenir.

Bu makine kodunu derlemek için mono çalışma zamanının JIT tarafından oluşturulması gereken makine kodunun oluşturulması zaman aldığından Xamarin.Mac uygulamasının başlatılmasını %20'ye kadar yavaşlatabilir.

Apple tarafından iOS'ta uygulanan sınırlamalar nedeniyle, IL kodunun JIT derlemesi Xamarin.iOS için kullanılamaz. Sonuç olarak, derleme döngüsü sırasında tüm Xamarin.iOS uygulamaları makine koduna derlenmiş tam zamanından önce (AOT) olur.

Xamarin.Mac'in yeni sürümü, Xamarin.iOS'un yaptığı gibi uygulama derleme döngüsü sırasında IL kodunuN AOT'sini oluşturma özelliğidir. Xamarin.Mac, gereken makine kodunun çoğunu derleyen, ancak çalışma zamanının gerekli trambolinleri derlemesine ve Reflection.Emit'i (ve şu anda Xamarin.Mac üzerinde çalışan diğer kullanım örneklerini) desteklemeye devam etme esnekliğine olanak tanıyan bir Karma AOT yaklaşımı kullanır.

AOT'nin Xamarin.Mac uygulamasına yardımcı olabileceği iki önemli alan vardır:

  • Daha iyi "yerel" kilitlenme günlükleri - Bir Xamarin.Mac uygulaması, Cocoa API'lerine geçersiz çağrılar yapılırken sık karşılaşılan yerel kodda kilitleniyorsa (kabul etmeyen bir yönteme gönderme null gibi), JIT çerçeveli yerel kilitlenme günlüklerini analiz etmek zordur. JIT çerçevelerinde hata ayıklama bilgileri olmadığından, onaltılık uzaklıklara sahip birden çok satır olacak ve neler olduğu hakkında hiçbir ipucu olmayacaktır. AOT, "gerçek" adlı çerçeveler oluşturur ve izlemeleri okumak çok daha kolaydır. Bu, Xamarin.Mac uygulamasının lldb ve Instruments gibi yerel araçlarla daha iyi etkileşim kuracağı anlamına da gelir.
  • Daha iyi başlatma süresi performansı - Birden çok saniyelik başlangıç süresine sahip büyük Xamarin.Mac uygulamaları için JIT'nin kodun tamamını derlemesi önemli miktarda zaman alabilir. AOT bu işi önden yapar.

AOT derlemesini etkinleştirme

AOT, Çözüm Gezgini Proje Adı'na çift tıklayarak, Mac Derlemesi'ne gidip Ek mmp bağımsız değişkenleri: alanına ekleyerek --aot:[options] Xamarin.Mac'te etkinleştirilir (burada AOT türünü denetlemek için bir veya daha fazla seçenek vardır[options], aşağıya bakın). Örneğin:

Ek mmp bağımsız değişkenlerine AOT ekleme

Önemli

AOT derlemesinin etkinleştirilmesi, derleme süresini bazen birkaç dakikaya kadar önemli ölçüde artırır, ancak uygulama başlatma sürelerini ortalama %20 artırabilir. Sonuç olarak, AOT derlemesi yalnızca Xamarin.Mac uygulamasının Yayın derlemelerinde etkinleştirilmelidir.

Aot derleme seçenekleri

Xamarin.Mac uygulamasında AOT derlemesi etkinleştirilirken ayarlanabilen birkaç farklı seçenek vardır:

  • none - AOT derlemesi yok. Bu varsayılan ayardır.
  • all - AOT, MonoBundle'daki tüm derlemeleri derler.
  • core- AOT, System ve mscorlib derlemelerini derlerXamarin.Mac.
  • sdk - AOT, ve Temel Sınıf Kitaplıkları (BCL) derlemelerini derler Xamarin.Mac .
  • |hybrid - Bunu yukarıdaki seçeneklerden birine eklemek, IL striptizine izin veren ancak daha uzun derleme sürelerine neden olacak karma AOT'yi etkinleştirir.
  • + - AOT derlemesi için tek bir dosya içerir.
  • - - AOT derlemesinden tek bir dosyayı kaldırır.

Örneğin, --aot:all,-MyAssembly.dll MonoBundle MyAssembly.dll içindeki tüm derlemelerde AOT derlemesini etkinleştirir ve --aot:core|hybrid,+MyOtherAssembly.dll,-mscorlib.dll karmayı etkinleştirir; kod AOT'sini MyOtherAssembly.dll içerir ve hariç tutarak.mscorlib.dll

Kısmi statik registrar

Xamarin.Mac uygulaması geliştirirken, bir değişikliği tamamlama ile test etme arasındaki süreyi en aza indirmek, geliştirme son tarihlerini karşılama açısından önemli hale gelebilir. Kod temellerinin ve birim testlerinin modüler hale getirilmesi gibi stratejiler, bir uygulamanın pahalı bir tam yeniden derleme gerektirme sayısını azalttığı için derleme sürelerini azaltmaya yardımcı olabilir.

Ayrıca, Xamarin.Mac'te yeni olan Kısmi Statik Registrar (Xamarin.iOS'un öncüsü) hata ayıklama yapılandırmasında Xamarin.Mac uygulamasının başlatma sürelerini önemli ölçüde azaltabilir. Kısmi Statik'i Registrar kullanmanın hata ayıklama başlatmada neredeyse 5 katlık bir iyileştirmeyi nasıl sıkabileceğini anlamak, ne registrar olduğu, statik ve dinamik arasındaki farkın ne olduğu ve bu "kısmi statik" sürümün ne yaptığı konusunda biraz arka plan gerektirecektir.

Hakkında registrar

Herhangi bir Xamarin.Mac uygulamasının kaputunun altında Apple ve çalışma zamanının Objective-C Cocoa çerçevesi bulunur. Bu "yerel dünya" ile C# 'nin "yönetilen dünyası" arasında bir köprü oluşturmak Xamarin.Mac'in birincil sorumluluğudur. Bu görevin bir bölümü, yöntemi içinde registrarNSApplication.Init () yürütülen tarafından işlenir. Bu, Xamarin.Mac'te Cocoa API'lerinin NSApplication.Init ilk olarak çağrılması gerektiğinin bir nedenidir.

'registrarnin işi, çalışma zamanını uygulamanın , , NSViewNSWindowve NSObjectgibi NSApplicationDelegatesınıflardan türetilen C# sınıflarının varlığı hakkında bilgilendirmektirObjective-C. Bunun için nelerin kaydedilmesi gerektiğini ve her türdeki hangi öğelerin raporlanması gerektiğini belirlemek için uygulamadaki tüm türlerin taranması gerekir.

Bu tarama, uygulamanın başlangıcında yansımayla dinamik olarak veya derleme zamanı adımı olarak statik olarak yapılabilir. Bir kayıt türü seçerken geliştiricinin aşağıdakilerden haberdar olması gerekir:

  • Statik kayıt başlatma sürelerini önemli ölçüde azaltabilir, ancak derleme sürelerini önemli ölçüde yavaşlatabilir (genellikle iki hata ayıklama derleme süresinden daha fazla). Bu, Yayın yapılandırma derlemeleri için varsayılan değerdir.
  • Dinamik kayıt, uygulama başlatılana kadar bu işi geciktirip kod oluşturmayı atlar, ancak bu ek çalışma, uygulama başlatma işleminde fark edilebilir bir duraklama (en az iki saniye) oluşturabilir. Bu, özellikle dinamik kayıt varsayılanı olan ve yansıması daha yavaş olan hata ayıklama yapılandırma derlemelerinde fark edilir.

İlk olarak Xamarin.iOS 8.13'te kullanıma sunulan Kısmi Statik Kayıt, geliştiriciye her iki seçenekte de en iyi sonucu verir. Içindeki her öğenin Xamarin.Mac.dll kayıt bilgilerini önceden hesaplayarak ve bu bilgileri Xamarin.Mac ile statik bir kitaplıkta (yalnızca derleme zamanında bağlanması gereken) göndererek Microsoft, derleme süresini etkilemeden dinamik registrar yansıma süresinin çoğunu kaldırmıştır.

Kısmi statik etkinleştirme registrar

Xamarin.Mac'te Kısmi StatikRegistrar, Çözüm Gezgini Proje Adı'na çift tıklayarak, Mac Derlemesi'ne gidip Ek mmp bağımsız değişkenleri: alanına ekleyerek --registrar:static etkinleştirilir. Örneğin:

Ek mmp bağımsız değişkenlerine kısmi statik registrar ekleme

Ek kaynaklar

Aşağıda, işlerin dahili olarak nasıl çalıştığına ilişkin daha ayrıntılı açıklamalar bulabilirsiniz: