Einschränkungen von Xamarin.iOS

Da Anwendungen, die Xamarin.iOS verwenden, zu statischem Code kompiliert werden, ist es nicht möglich, Einrichtungen zu verwenden, die zur Laufzeit codegenerierung erfordern.

Dies sind die Xamarin.iOS-Einschränkungen im Vergleich zu Desktop Mono:

Eingeschränkter Generischer Support

Im Gegensatz zu herkömmlichen Mono/.NET wird Code auf dem iPhone statisch im Voraus kompiliert, anstatt bei Bedarf von einem JIT-Compiler kompiliert zu werden.

Die Full AOT-Technologie von Mono hat einige Einschränkungen in Bezug auf Generika, die verursacht werden, da nicht jede mögliche generische Instanziierung zur Kompilierzeit im Voraus bestimmt werden kann. Dies ist kein Problem für reguläre .NET- oder Mono-Runtimes, da der Code immer zur Laufzeit mithilfe des Just-in-Time-Compilers kompiliert wird. Dies stellt jedoch eine Herausforderung für einen statischen Compiler wie Xamarin.iOS dar.

Einige der häufigen Probleme, auf die Entwickler stoßen, sind:

Generische Unterklassen von NSObjects sind begrenzt

Xamarin.iOS bietet derzeit nur eingeschränkte Unterstützung für das Erstellen generischer Unterklassen der NSObject-Klasse, z. B. keine Unterstützung für generische Methoden. Ab Version 7.2.1 ist die Verwendung generischer Unterklassen von NSObjects wie hier möglich:

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

Hinweis

Generische Unterklassen von NSObjects sind zwar möglich, es gibt jedoch einige Einschränkungen. Weitere Informationen finden Sie im Dokument Generische Unterklassen von NSObject .

Keine dynamische Codegenerierung

Da der iOS-Kernel verhindert, dass eine Anwendung Code dynamisch generiert, unterstützt Xamarin.iOS keine Form der dynamischen Codegenerierung. Dazu zählen unter anderem folgende Einstellungen:

  • System.Reflection.Emit ist nicht verfügbar.
  • Keine Unterstützung für System.Runtime.Remoting.
  • Keine Unterstützung für das dynamische Erstellen von Typen (kein Type.GetType ("MyType'1")), obwohl die Suche nach vorhandenen Typen (z. B. Type.GetType ("System.String") problemlos funktioniert.
  • Reverse-Rückrufe müssen zur Kompilierzeit bei der Runtime registriert werden.

System.Reflection.Emit

Das Fehlen von System.Reflektion. Emit bedeutet, dass kein Code funktioniert, der von der Laufzeitcodegenerierung abhängig ist. Dazu zählen etwa:

  • Die Dynamic Language Runtime.

  • Alle Sprachen, die auf der Dynamic Language Runtime basieren.

  • TransparentProxy von Remoting oder etwas anderes, das dazu führen würde, dass die Runtime Dynamisch Code generiert.

    Wichtig

    Verwechseln Sie Reflection.Emit nicht mit Reflexion. Bei Reflection.Emit geht es darum, Code dynamisch zu generieren und diesen Code JITed zu haben und in nativen Code kompiliert zu haben. Aufgrund der Einschränkungen unter iOS (keine JIT-Kompilierung) wird dies nicht unterstützt.

Aber die gesamte Reflexions-API, einschließlich Type.GetType ("someClass"), auflisten von Methoden, Auflisten von Eigenschaften, Abrufen von Attributen und Werten funktioniert einwandfrei.

Verwenden von Delegaten zum Aufrufen nativer Funktionen

Um eine native Funktion über einen C#-Delegaten aufzurufen, muss die Deklaration des Delegaten mit einem der folgenden Attribute versehen sein:

Wenn eines dieser Attribute nicht angegeben wird, führt dies zu einem Laufzeitfehler, z. B.:

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.

Reverse Callbacks

In Standard Mono ist es möglich, C#-Delegatinstanzen anstelle eines Funktionszeigers an nicht verwalteten Code zu übergeben. Die Runtime transformiert diese Funktionszeiger in der Regel in einen kleinen Thunk, der es nicht verwaltetem Code ermöglicht, in verwalteten Code zurückzurufen.

In Mono werden diese Brücken vom Just-in-Time-Compiler implementiert. Bei verwendung des für das iPhone erforderlichen Vorabcompilers gibt es an dieser Stelle zwei wichtige Einschränkungen:

  • Sie müssen alle Rückrufmethoden mit dem MonoPInvokeCallbackAttribute kennzeichnen.
  • Die Methoden müssen statische Methoden sein, es gibt keine Unterstützung für instance Methoden.

Kein Remoting

Der Remotingstapel ist unter Xamarin.iOS nicht verfügbar.

Laufzeit deaktivierte Features

Die folgenden Features wurden in der iOS-Runtime von Mono deaktiviert:

  • Profiler
  • Reflection.Emit
  • Reflection.Emit.Save-Funktionalität
  • COM-Bindungen
  • Die JIT-Engine
  • Metadatenüberprüfung (da kein JIT vorhanden ist)

Einschränkungen der .NET-API

Die verfügbar gemachte .NET-API ist eine Teilmenge des vollständigen Frameworks, da in iOS nicht alles verfügbar ist. In den häufig gestellten Fragen finden Sie eine Liste der derzeit unterstützten Assemblys.

Insbesondere enthält das von Xamarin.iOS verwendete API-Profil System.Configuration nicht, sodass es nicht möglich ist, externe XML-Dateien zum Konfigurieren des Verhaltens der Runtime zu verwenden.