Condividi tramite


Limitazioni di Xamarin.iOS

Poiché le applicazioni che usano Xamarin.iOS vengono compilate in codice statico, non è possibile usare funzionalità che richiedono la generazione di codice in fase di esecuzione.

Queste sono le limitazioni di Xamarin.iOS rispetto a Mono desktop:

Supporto generics limitato

A differenza del tradizionale Mono/.NET, il codice in i Telefono viene compilato in modo statico in anticipo anziché essere compilato su richiesta da un compilatore JIT.

La tecnologia Full AOT di Mono presenta alcune limitazioni rispetto ai generics, queste sono causate perché non tutte le possibili istanze generiche possono essere determinate in anticipo in fase di compilazione. Questo non è un problema per i normali runtime .NET o Mono perché il codice viene sempre compilato in fase di esecuzione usando il compilatore JUST IN TIME. Ma questo rappresenta una sfida per un compilatore statico come Xamarin.iOS.

Alcuni dei problemi comuni riscontrati dagli sviluppatori includono:

Le sottoclassi generiche di NSObjects sono limitate

Xamarin.iOS offre attualmente un supporto limitato per la creazione di sottoclassi generiche della classe NSObject, ad esempio nessun supporto per i metodi generici. A partire dalla versione 7.2.1, è possibile usare sottoclassi generiche di NSObjects, come illustrato di seguito:

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

Nota

Sebbene siano possibili sottoclassi generiche di NSObject, esistono alcune limitazioni. Per altre informazioni, leggere le sottoclassi generiche del documento NSObject

Nessuna generazione di codice dinamico

Poiché il kernel iOS impedisce a un'applicazione di generare codice in modo dinamico, Xamarin.iOS non supporta alcuna forma di generazione di codice dinamico. tra cui:

  • System.Reflection.Emit non è disponibile.
  • Nessun supporto per System.Runtime.Remoting.
  • Nessun supporto per la creazione dinamica di tipi (nessun Type.GetType ("MyType'1")), anche se la ricerca di tipi esistenti (Type.GetType ("System.String") ad esempio, funziona bene.
  • I callback inversi devono essere registrati con il runtime in fase di compilazione.

System.Reflection.Emit

Mancanza di System.Reflection. Emit indica che non funzionerà alcun codice che dipende dalla generazione del codice di runtime. inclusi elementi come i seguenti:

  • Runtime del linguaggio dinamico.

  • Tutti i linguaggi basati su Dynamic Language Runtime.

  • TransparentProxy della comunicazione remota o qualsiasi altro elemento che provocherebbe la generazione dinamica del codice da parte del runtime.

    Importante

    Non confondere Reflection.Emit con reflection. Reflection.Emit riguarda la generazione dinamica del codice e la compilazione del codice in codice nativo. A causa delle limitazioni per iOS (nessuna compilazione JIT) non è supportata.

Tuttavia, l'intera API Reflection, incluso Type.GetType ("someClass"), elenca i metodi, elenca le proprietà, recupera attributi e valori funziona correttamente.

Uso di delegati per chiamare funzioni native

Per chiamare una funzione nativa tramite un delegato C#, la dichiarazione del delegato deve essere decorata con uno degli attributi seguenti:

Se non si specifica uno di questi attributi, verrà generato un errore di runtime, ad esempio:

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.

Callback inverso

In Mono standard è possibile passare istanze di delegati C# al codice non gestito al posto di un puntatore a funzione. Il runtime in genere trasforma tali puntatori a funzione in un piccolo threadk che consente al codice non gestito di richiamare il codice gestito.

In Mono questi bridge vengono implementati dal compilatore JUST-in-Time. Quando si usa il compilatore in anticipo richiesto da i Telefono esistono due limitazioni importanti a questo punto:

  • È necessario contrassegnare tutti i metodi di callback con MonoPInvokeCallbackAttribute
  • I metodi devono essere metodi statici, non esiste alcun supporto per i metodi di istanza.

Nessuna comunicazione remota

Lo stack di comunicazione remota non è disponibile in Xamarin.iOS.

Funzionalità disabilitate dal runtime

Le funzionalità seguenti sono state disabilitate nel runtime iOS di Mono:

  • Profiler
  • Reflection.Emit
  • Funzionalità Reflection.Emit.Save
  • Associazioni COM
  • Motore JIT
  • Verifica dei metadati (poiché non è presente JIT)

Limitazioni dell'API .NET

L'API .NET esposta è un subset del framework completo, perché non tutto è disponibile in iOS. Vedere le domande frequenti per un elenco degli assembly attualmente supportati.

In particolare, il profilo API usato da Xamarin.iOS non include System.Configuration, quindi non è possibile usare file XML esterni per configurare il comportamento del runtime.