Sdílet prostřednictvím


Omezení Xamarin.iOS

Vzhledem k tomu, že aplikace používající Xamarin.iOS se kompilují do statického kódu, není možné používat žádná zařízení, která vyžadují generování kódu za běhu.

Toto jsou omezení Xamarin.iOS v porovnání s desktopovým Mono:

Omezená podpora obecných typů

Na rozdíl od tradiční mono/.NET se kód na i Telefon staticky kompiluje předem, místo aby ho kompilátor JIT zkompiloval na vyžádání.

Technologie Full AOT společnosti Mono má několik omezení týkajících se obecných typů, jsou způsobeny, protože ne všechny možné obecné instance je možné určit předem v době kompilace. To není problém pro běžné moduly runtime .NET nebo Mono, protože kód je vždy zkompilován za běhu pomocí kompilátoru Just in Time. To ale představuje výzvu pro statický kompilátor, jako je Xamarin.iOS.

Mezi běžné problémy, na které vývojáři narazili, patří:

Obecné podtřídy objektů NSObjects jsou omezené.

Xamarin.iOS v současné době má omezenou podporu pro vytváření obecných podtříd NSObject třídy, například bez podpory obecných metod. Od verze 7.2.1 je možné použít obecné podtřídy objektů NSObjects, jako je tato:

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

Poznámka:

I když jsou možné obecné podtřídy objektů NSObject, existuje několik omezení. Další informace najdete v obecných podtřídách dokumentu NSObject .

Bez dynamického generování kódu

Vzhledem k tomu, že jádro iOS brání aplikaci v dynamickém generování kódu, Xamarin.iOS nepodporuje žádnou formu dynamického generování kódu. Tady jsou některé z nich:

  • Systém. Reflexe ion. Generování není k dispozici.
  • Pro System.Runtime.Remoting se nepodporuje.
  • Bez podpory dynamického vytváření typů (bez Type.GetType ("MyType'1")), i když hledáte existující typy (Type.GetType ("System.String") například funguje dobře).
  • Zpětné volání zpětného volání musí být zaregistrované v modulu runtime v době kompilace.

Systému. Reflexe ion. Vydávat

Nedostatek systému. Reflexe ion. Generování znamená, že nebude fungovat žádný kód, který závisí na generování kódu modulu runtime. Patří sem například:

  • Modul runtime dynamického jazyka.

  • Všechny jazyky založené na modulu Runtime dynamického jazyka

  • Remoting je TransparentProxy nebo cokoli jiného, co by způsobilo dynamické generování kódu modulu runtime.

    Důležité

    Nezaměňujte Reflexe ion. Vygenerujte s Reflexe ionem. Reflexe ion. Emit se týká dynamického generování kódu a má kód JITed a zkompilovaný do nativního kódu. Vzhledem k omezením v iOSu (bez kompilace JIT) se tato možnost nepodporuje.

Ale celé rozhraní API Reflexe ion, včetně Type.GetType ("someClass"), výpis metod, výpis vlastností, načítání atributů a hodnot funguje jednoduše správně.

Volání nativních funkcí pomocí delegátů

Pokud chcete volat nativní funkci prostřednictvím delegáta jazyka C#, musí být deklarace delegáta opatřena jedním z následujících atributů:

Pokud se nepodaří zadat některý z těchto atributů, dojde k chybě za běhu, například:

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.

Zpětné volání

Ve standardním Mono je možné předat instance delegáta jazyka C# nespravovanému kódu místo ukazatele funkce. Modul runtime obvykle transformuje ukazatele těchto funkcí na malý blok, který umožňuje nespravovaný kód volat zpět do spravovaného kódu.

V Mono jsou tyto mosty implementovány kompilátorem Just-in-Time. Při použití předem požadovaného kompilátoru i Telefon v tomto okamžiku existují dvě důležitá omezení:

  • Všechny metody zpětného volání je nutné označit příznakem MonoPInvokeCallbackAttribute.
  • Metody musí být statické, pro metody instance neexistuje žádná podpora.

Bez vzdálené komunikace

Zásobník vzdálené komunikace není v Xamarin.iOS dostupný.

Zakázané funkce modulu runtime

V modulu runtime iOS Mono byly zakázány následující funkce:

  • Profiler
  • Reflexe ion. Vydávat
  • Reflexe ion. Funkce Emit.Save
  • Vazby modelu COM
  • Modul JIT
  • Ověřovatel metadat (protože neexistuje žádný JIT)

Omezení rozhraní .NET API

Vystavené rozhraní .NET API je podmnožinou celé architektury, protože ne vše je dostupné v iOSu. Seznam aktuálně podporovaných sestavení najdete v nejčastějších dotazech.

Konkrétně profil rozhraní API používaný Xamarin.iOS nezahrnuje System.Configuration, takže není možné ke konfiguraci chování modulu runtime použít externí soubory XML.