Omezení pro Xamarin. iOSLimitations of Xamarin.iOS

Vzhledem k tomu, že aplikace používající Xamarin. iOS jsou kompilovány do statického kódu, není možné použít žádné zařízení, které vyžaduje generování kódu za běhu.Since applications using Xamarin.iOS are compiled to static code, it is not possible to use any facilities that require code generation at runtime.

Jedná se o omezení Xamarin. iOS v porovnání s desktopovou mono:These are the Xamarin.iOS limitations compared to desktop Mono:

Podpora omezených obecných typůLimited Generics Support

Na rozdíl od tradičních mono/. NET je kód na iPhonu staticky zkompilován před časem a nikoli kompilován na vyžádání kompilátorem JIT.Unlike traditional Mono/.NET, code on the iPhone is statically compiled ahead of time instead of being compiled on demand by a JIT compiler.

Zcela kompletní technologie AOT má několik omezení vzhledem k obecným typům, což je způsobeno tím, že ne všechny možné obecné vytváření instancí lze určit v době kompilace předem.Mono's Full AOT technology has a few limitations with respect to generics, these are caused because not every possible generic instantiation can be determined up front at compile time. Nejedná se o problém s běžnými moduly runtime .NET nebo mono, protože kód je vždy kompilován za běhu pomocí kompilátoru just in time.This is not a problem for regular .NET or Mono runtimes as the code is always compiled at runtime using the Just in Time compiler. To ale představuje výzvu pro statický kompilátor jako Xamarin. iOS.But this poses a challenge for a static compiler like Xamarin.iOS.

Mezi běžné problémy, které vývojáři spouštějí, patří:Some of the common problems that developers run into, include:

Obecné podtřídy NSObjects jsou omezené.Generic Subclasses of NSObjects are limited

Xamarin. iOS má v současné době omezené podpory pro vytváření obecných podtříd třídy Nsobjectu, jako je například žádná podpora pro obecné metody.Xamarin.iOS currently has limited support for creating generic subclasses of the NSObject class, such as no support for generic methods. Od 7.2.1 je možné použít obecné podtřídy NSObjects, jako je tato:As of 7.2.1, using generic subclasses of NSObjects is possible, like this one:

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

Poznámka

I když jsou možné obecné podtřídy NSObjects, je k dispozici několik omezení.While generic subclasses of NSObjects are possible, there are a few limitations. Přečtěte si Obecné podtřídy dokumentu nsobjectu , kde najdete další informace.Read the Generic subclasses of NSObject document for more information

Bez generování dynamického kóduNo Dynamic Code Generation

Vzhledem k tomu, že jádro iOS brání aplikaci v dynamickém generování kódu, Xamarin. iOS nepodporuje žádnou formu generování dynamického kódu.Since the iOS kernel prevents an application from generating code dynamically, Xamarin.iOS does not support any form of dynamic code generation. Zde jsou některé z nich:These include:

  • System. Reflection. Emit není k dispozici.The System.Reflection.Emit is not available.
  • Není podporována podpora pro System. Runtime. Vzdálená komunikace.No support for System.Runtime.Remoting.
  • Žádná podpora pro vytváření typů dynamicky (bez Type. GetType ("MyType ' 1")), i když hledají existující typy (Type. GetType ("System. String"), například funguje pouze jemné).No support for creating types dynamically (no Type.GetType ("MyType`1")), although looking up existing types (Type.GetType ("System.String") for example, works just fine).
  • Reverzní zpětná volání musí být v době kompilace registrována s modulem runtime.Reverse callbacks must be registered with the runtime at compile time.

System. Reflection. EmitSystem.Reflection.Emit

Nedostatek System. Reflection.The lack of System.Reflection. Emites znamená, že nebude fungovat žádný kód, který závisí na generování kódu za běhu.Emit means that no code that depends on runtime code generation will work. Patří sem například:This includes things like:

  • Modul dynamického jazyka.The Dynamic Language Runtime.

  • Všechny jazyky postavené na dynamickém jazykovém modulu runtime.Any languages built on top of the Dynamic Language Runtime.

  • TransparentProxy vzdálené komunikace nebo cokoli jiného, co by mohlo způsobit dynamické generování kódu v modulu runtime.Remoting's TransparentProxy or anything else that would cause the runtime to generate code dynamically.

    Důležité

    Nezaměňujte reflexe. emituje se s reflexí.Do not confuse Reflection.Emit with Reflection. Reflexe. emituje dynamické generování kódu a tento kód JITed a zkompiluje do nativního kódu.Reflection.Emit is about generating code dynamically and have that code JITed and compiled to native code. Z důvodu omezení pro iOS (žádná kompilace JIT) to není podporováno.Due to the limitations on iOS (no JIT compilation) this is not supported.

Ale celé rozhraní API pro reflexi, včetně Type. GetType ("someClass"), metody výpisu, vlastnosti výpisu a načítání atributů a hodnot funguje přesně.But the entire Reflection API, including Type.GetType ("someClass"), listing methods, listing properties, fetching attributes and values works just fine.

Použití delegátů k volání nativních funkcíUsing Delegates to call Native Functions

Chcete-li volat nativní funkci prostřednictvím delegáta jazyka C#, deklaraci delegáta musí být upravena jedním z následujících atributů:To call a native function through a C# delegate, the delegate's declaration must be decorated with one of the following attributes:

Neúspěšné zadání některého z těchto atributů způsobí, že dojde k chybě za běhu, například:Failing to provide one of these attributes will result in a runtime error such as:

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.

Reverzní zpětná voláníReverse Callbacks

Ve standardním mono je možné předat instance delegáta jazyka C# do nespravovaného kódu místo ukazatele na funkci.In standard Mono it is possible to pass C# delegate instances to unmanaged code in lieu of a function pointer. Modul runtime obvykle transformuje tyto ukazatele na tyto funkce na malý převod, který umožňuje nespravovanému kódu volat zpět do spravovaného kódu.The runtime would typically transform those function pointers into a small thunk that allows unmanaged code to call back into managed code.

V mono tyto mosty implementuje kompilátor za běhu.In Mono these bridges are implemented by the Just-in-Time compiler. Při použití předem připraveného kompilátoru vyžadovaného pro iPhone jsou v tuto chvíli k dispozici dvě důležitá omezení:When using the ahead-of-time compiler required by the iPhone there are two important limitations at this point:

  • Všechny metody zpětného volání musíte označit pomocí MonoPInvokeCallbackAttributeYou must flag all of your callback methods with the MonoPInvokeCallbackAttribute
  • Metody musí být statické metody, neexistuje podpora metod instancí.The methods have to be static methods, there is no support for instance methods.

Žádná Vzdálená komunikaceNo Remoting

Zásobník vzdálené komunikace není v Xamarin. iOS k dispozici.The Remoting stack is not available on Xamarin.iOS.

Zakázané funkce modulu runtimeRuntime Disabled Features

V modulu runtime iOS v mono byly zakázány následující funkce:The following features have been disabled in Mono's iOS Runtime:

  • ProfilerProfiler
  • Reflection. EmitReflection.Emit
  • Reflexe. Emit. Save – funkceReflection.Emit.Save functionality
  • Vazby COMCOM bindings
  • Modul JITThe JIT engine
  • Ověřovač metadat (vzhledem k tomu, že není k dispozici JIT)Metadata verifier (since there is no JIT)

Omezení rozhraní .NET API.NET API Limitations

Zveřejněné rozhraní API .NET je podmnožinou celého rozhraní, protože není všechno dostupné v iOS.The .NET API exposed is a subset of the full framework as not everything is available in iOS. Seznam aktuálně podporovaných sestavenínajdete v tématu Nejčastější dotazy.See the FAQ for a list of currently supported assemblies.

Konkrétně profil rozhraní API, který používá Xamarin. iOS, nezahrnuje System. Configuration, takže není možné použít externí soubory XML ke konfiguraci chování modulu runtime.In particular, the API profile used by Xamarin.iOS does not include System.Configuration, so it is not possible to use external XML files to configure the behavior of the runtime.