Xamarin.iOS sınırlamaları

Xamarin.iOS kullanan uygulamalar statik koda derlenmiş olduğu için çalışma zamanında kod oluşturma gerektiren özellikleri kullanmak mümkün değildir.

Bunlar masaüstü Mono'ya kıyasla Xamarin.iOS sınırlamalarıdır:

Sınırlı Genel Tür Desteği

Geleneksel Mono/.NET'in aksine, iPhone JIT derleyicisi tarafından isteğe bağlı olarak derlenmesi yerine statik olarak zamanından önce derlenmiş olur.

Mono'nun Tam AOT teknolojisinin genel türlerle ilgili birkaç sınırlaması vardır. Bunun nedeni, olası her genel örneklemenin derleme zamanında önden belirlenemamalarıdır. Kod her zaman Tam Zamanında derleyicisi kullanılarak çalışma zamanında derlenmiş olduğu için normal .NET veya Mono çalışma zamanları için bu sorun değildir. Ancak bu, Xamarin.iOS gibi statik bir derleyici için zorluk teşkil ediyor.

Geliştiricilerin sık karşılaşılan sorunlardan bazıları şunlardır:

NSObjects'in Genel Alt Sınıfları Sınırlıdır

Xamarin.iOS şu anda NSObject sınıfının genel alt sınıflarını oluşturmak için sınırlı desete (genel yöntemler için destek yok gibi) sahip. 7.2.1'den sonra, NSObjects'in genel alt sınıflarını kullanmak şu şekilde mümkündür:

class Foo<T> : UIView {
    [..]
}

Not

NSObjects'in genel alt sınıfları mümkün olduğunda, birkaç sınırlama vardır. Daha fazla bilgi için NSObject'in Genel alt sınıfları belgesini okuyun

Dinamik Kod Oluşturma Yok

iOS çekirdeği, bir uygulamanın dinamik olarak kod oluşturmasını engelleyene kadar, Xamarin.iOS herhangi bir dinamik kod oluşturma formunu desteklemez. Bu modüller şunlardır:

  • System.Reflection.Emit kullanılamıyor.
  • System.Runtime.Remoting desteği yok.
  • Türleri dinamik olarak oluşturma desteği yoktur (Type.GetType ("MyType'1")), ancak mevcut türleri (Type.GetType ("System.String") aramanız yeterli olur.
  • Ters geri çağırmalar derleme zamanında çalışma zamanının kaydında olmalıdır.

System.Reflection.Emit

System.Reflection olmaması. Yay, çalışma zamanı kodu oluşturmaya bağlı hiçbir kodun çalışmayacağı anlamına gelir. Buna aşağıdakiler gibi şeyler dahildir:

  • Dinamik Dil Çalışma Zamanı.

  • Dinamik Dil Çalışma Zamanı'nın üzerine inşa edilen tüm diller.

  • Remoting's TransparentProxy veya çalışma zamanının dinamik olarak kod oluşturmasını neden olacak başka bir şey.

    Önemli

    Reflection.Emit'i Yansıma ilekarıştırmayın. Reflection.Emit, dinamik olarak kod oluşturmak ve bu kodun JITed ve yerel koda derlenmiş olmasıyla ilgilidir. iOS sınırlamaları nedeniyle (JIT derlemesi yok) bu desteklenmiyor.

Ancak Type.GetType ("someClass") dahil olmak üzere Yansıma API'sini listeleme yöntemleri, özellikleri listeleme, öznitelikleri ve değerleri getirme yeterli olur.

Yerel İşlevleri çağıran Temsilciler kullanma

Bir C# temsilcisi aracılığıyla yerel bir işlev çağrısı yapmak için, temsilcinin bildirimi aşağıdaki özniteliklerden biri ile birlikte dekore edilmiş olması gerekir:

Bu özniteliklerden biri sağlanamaz, şöyle bir çalışma zamanı hatasına neden olur:

System.ExecutionEngineException: Attempting to JIT compile method '(wrapper managed-to-native) YourClass/YourDelegate:wrapper_aot_native(object,intptr,intptr)' while running in aot-only mode.

Ters Geri Çağırmalar

Standart Mono'da C# temsilci örneklerini bir işlev işaretçisi yerine, yönetimsiz koda devredebilirsiniz. Çalışma zamanı genellikle bu işlev işaretçilerini yönetilemeyen kodun yönetilen koda geri çağrılmalarına olanak sağlayan küçük bir thunk'a dönüştürer.

Mono'da bu köprüler Tam Zamanında derleyicisi tarafından uygulanır. Uygulama için gereken zamanından önce derleyiciyi kullanırken iPhone bu noktada iki önemli sınırlama vardır:

  • MonoPInvokeCallbackAttribute ile tüm geri çağırma yöntemlerinize bayrak asmanız gerekir
  • Yöntemlerin statik yöntemler olması gerekir, örnek yöntemleri için destek yoktur.

Moting Yok

Remoting yığını Xamarin.iOS'ta kullanılamaz.

Çalışma Zamanı Devre Dışı Özellikleri

Mono'nun iOS Çalışma Zamanında aşağıdaki özellikler devre dışı bırakılmıştır:

  • Profil Oluşturucu
  • Emit
  • Reflection.Emit.Save işlevi
  • COM bağlamaları
  • JIT altyapısı
  • Meta veri doğrulayıcısı (JIT yoktur)

.NET API Sınırlamaları

iOS'ta her şey mevcut değildir ve .NET API'si tam çerçevenin bir alt kümesidir. Şu anda desteklenen derlemelerin listesi için bkz. SSS.

Özellikle, Xamarin.iOS tarafından kullanılan API profili System.Configuration'ı içermez, bu nedenle çalışma zamanının davranışını yapılandırmak için dış XML dosyalarını kullanmak mümkün değildir.