Omezení Xamarin.iOS
Vzhledem k tomu, že aplikace používající Xamarin.iOS se kompilují do statického kódu, není možné použít žádné funkce, které vyžadují generování kódu za běhu.
Toto jsou omezení Xamarin.iOS v porovnání s desktopem Mono:
Omezená podpora obecných typů
Na rozdíl od tradičního mono/.NET je kód na iPhone staticky kompilován předem namísto kompilaci kompilátorem JIT na vyžádání.
Technologie Full AOT mono má několik omezení s ohledem na obecné typy, které jsou způsobené tím, že ne všechny možné obecné instance je možné určit předem v době kompilace. U běžných modulu runtime .NET nebo Mono to není problém, protože kód se vždy kompiluje 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 nachádí, patří:
Obecné podtřídy objektů NSObject jsou omezené
Xamarin.iOS má v současné době omezenou podporu pro vytváření obecných podtříd třídy NSObject, například nepodporuje obecné metody. Od 7.2.1 je možné používat obecné podtřídy objektů NSObject, 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 dokumentu Obecné podtřídy objektu NSObject .
Žádné dynamické 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:
- System.Reflection.Emit není k dispozici.
- Nepodporuje System.Runtime.Remoting.
- Nepodporuje dynamické vytváření typů (bez Type.GetType ("MyType'1")), i když hledání existujících typů (Type.GetType ("System.String") například funguje bez problémů).
- Zpětná zpětná volání musí být zaregistrovaná v modulu runtime v době kompilace.
System.reflection.emit
Absence System.Reflection. Generování znamená, že nebude fungovat žádný kód, který závisí na generování kódu modulu runtime. Patří sem například:
Modul Dynamic Language Runtime.
Všechny jazyky postavené na modulu Dynamic Language Runtime.
TransparentníProxy vzdálené komunikace nebo cokoli jiného, co by způsobilo, že modul runtime generuje kód dynamicky.
Důležité
Nezaměňujte Reflection.Emit sreflexí. Reflection.Emit se týká dynamického generování kódu a jeho zkompilování do nativního kódu. Kvůli omezením v iOSu (bez kompilace JIT) se tato funkce nepodporuje.
Celé rozhraní Reflection API, včetně Type.GetType (someClass), ale výpis metod, výpis vlastností, načítání atributů a hodnot funguje bez problémů.
Volání nativních funkcí pomocí delegátů
Chcete-li volat nativní funkci prostřednictvím delegáta jazyka C#, musí být deklarace delegátu dekorována jedním z následujících atributů:
- UnmanagedFunctionPointerAttribute (upřednostňované, protože je multi platformy a kompatibilní s .NET Standard 1.1+)
- MonoNativeFunctionWrapperAttribute
Pokud neposkytnete jeden 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 na funkci. Modul runtime obvykle transformuje tyto ukazatele na funkce na malý převodní blok, který umožňuje nespravovanému kódu volat zpět do spravovaného kódu.
V Mono jsou tyto mosty implementovány kompilátorem just-in-time. Při použití dopředné kompilátoru vyžadované iPhone v tuto chvíli existují dvě důležitá omezení:
- Všechny metody zpětného volání musíte označit příznakem pomocí atributu MonoPInvokeCallbackAttribute.
- Metody musí být statické, nepodporuje se žádné metody instance.
Bez vzdálené komunikace
Zásobník vzdálené komunikace není v Xamarin.iOS k dispozici.
Zakázané funkce modulu runtime
V modulu runtime iOS mono byly zakázány následující funkce:
- Profiler
- Reflection.Emit
- Funkce Reflection.Emit.Save
- Vazby modelu COM
- Modul JIT
- Ověřovatel metadat (protože neexistuje JIT)
Omezení rozhraní .NET API
Zveřejněné rozhraní API .NET je podmnožinou úplného rozhraní, protože v iOSu není k dispozici vše. Seznam aktuálně podporovaných sestavení najdete v nejčastějších dotazech.
Konkrétně profil rozhraní API používaný Xamarin.iOS neobsahuje System.Configuration, takže není možné použít externí soubory XML ke konfiguraci chování modulu runtime.