Ограничения Xamarin.iOS

Так как приложения, использующие Xamarin.iOS, компилируются в статический код, невозможно использовать любые средства, требующие создания кода во время выполнения.

Это ограничения Xamarin.iOS по сравнению с классическим Mono:

Ограниченная поддержка универсальных шаблонов

В отличие от традиционных Mono/.NET, код в i Телефон статически компилируется заранее, а не компилируется по запросу компилятором JIT.

Технология Full AOT Mono имеет несколько ограничений в отношении универсальных шаблонов, они вызваны, так как во время компиляции можно определить не все возможные универсальные экземпляры. Это не проблема для обычных сред выполнения .NET или Mono, так как код всегда компилируется во время выполнения с помощью компилятора Just in Time. Но это представляет проблему для статического компилятора, такого как Xamarin.iOS.

Некоторые распространенные проблемы, с которыми выполняются разработчики, включают:

Универсальные подклассы NSObjects ограничены

Xamarin.iOS в настоящее время имеет ограниченную поддержку создания универсальных подклассов класса NSObject, таких как отсутствие поддержки универсальных методов. По состоянию на 7.2.1 можно использовать универсальные подклассы NSObjects, как показано ниже:

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

Примечание.

Хотя универсальные подклассы NSObjects возможны, существует несколько ограничений. Дополнительные сведения см. в подклассах универсального документа NSObject

Нет динамического создания кода

Так как ядро iOS не позволяет приложению динамически создавать код, Xamarin.iOS не поддерживает любую форму динамического создания кода. Например:

  • Система. Рефлексия ion. Эмит недоступен.
  • Поддержка System.Runtime.Remoting не поддерживается.
  • Поддержка динамического создания типов (без Type.GetType ("MyType'1")), хотя ищет существующие типы (Type.GetType (System.String), например, работает просто хорошо.
  • Обратные обратные вызовы должны быть зарегистрированы в среде выполнения во время компиляции.

System.Reflection.Emit

Отсутствие системы. Рефлексия ion. Выдача означает, что код, зависящий от создания кода среды выполнения, не будет работать. Это включает в себя следующие вещи:

  • Среда выполнения динамического языка.

  • Все языки, созданные на основе динамической языковой среды выполнения.

  • Прозрачныйproxy удаленного взаимодействия или что-либо другое, что приведет к динамическому созданию кода во время выполнения.

    Внимание

    Не путайте Рефлексия. Выводится с Рефлексия ion. Рефлексия ion. Генерация кода заключается в динамическом создании кода и его коде JITed и компиляции в машинный код. Из-за ограничений для iOS (без JIT-компиляции) это не поддерживается.

Но весь API Рефлексия ion, включая Type.GetType ("someClass"), методы перечисления, перечисление свойств, получение атрибутов и значений работает просто хорошо.

Использование делегатов для вызова собственных функций

Чтобы вызвать собственную функцию через делегат C#, объявление делегата должно быть украшено одним из следующих атрибутов:

Не указать один из этих атрибутов приведет к ошибке среды выполнения, например:

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.

Обратные обратные вызовы

В стандартном mono можно передать экземпляры делегата C# в неуправляемый код вместо указателя функции. Среда выполнения обычно преобразует эти указатели функций в небольшой thunk, который позволяет неуправляемый код обратно вызывать в управляемый код.

В Mono эти мосты реализуются компилятором JIT. При использовании компилятора впереди времени, необходимого i Телефон на этом этапе существуют два важных ограничения:

  • Вы должны пометить все методы обратного вызова с помощью MonoPInvokeCallbackAttribute
  • Методы должны быть статическими методами, нет поддержки методов экземпляра.

Без удаленного взаимодействия

Стек удаленного взаимодействия недоступен в Xamarin.iOS.

Отключенные функции среды выполнения

Следующие функции отключены в среде выполнения iOS Mono:

  • Profiler
  • Рефлексия ion. Излучают
  • Рефлексия ion. Функция Emit.Save
  • Привязки COM
  • Подсистема JIT
  • Средство проверки метаданных (так как JIT отсутствует)

Ограничения API .NET

Предоставляемый API .NET представляет собой подмножество полной платформы, так как не все доступно в iOS. См. вопросы и ответы по списку поддерживаемых в настоящее время сборок.

В частности, профиль API, используемый Xamarin.iOS, не включает System.Configuration, поэтому нельзя использовать внешние XML-файлы для настройки поведения среды выполнения.