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

Так как для статического кода компилируются приложений с помощью Xamarin.iOS, не позволяет использовать все функции, для которых требуется создание кода во время выполнения.Since applications using Xamarin.iOS are compiled to static code, it is not possible to use any facilities that require code generation at runtime.

Существуют следующие ограничения Xamarin.iOS, по сравнению с рабочего стола Mono:These are the Xamarin.iOS limitations compared to desktop Mono:

Поддержка ограниченного универсальных типовLimited Generics Support

В отличие от традиционных Mono и .NET код на iPhone статически компилируется заранее вместо компиляции по требованию с помощью 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.

Mono полный AOT технология имеет ряд ограничений по отношению к универсальные шаблоны, они возникают, так как не все возможные универсального экземпляра можно определить заранее во время компиляции.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. Это не проблема для регулярного сред выполнения .NET и Mono как во время выполнения, используя непосредственно в компилятор всегда компиляции кода.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. Но это препятствие для статическим компилятором как Xamarin.iOS.But this poses a challenge for a static compiler like Xamarin.iOS.

Ниже перечислены некоторые из распространенных проблем, с которыми разработчики столкнуться.Some of the common problems that developers run into, include:

Универсальный подклассы NSObjects ограниченыGeneric Subclasses of NSObjects are limited

В настоящее время Xamarin.iOS имеет ограниченную поддержку создания общие подклассы NSObject класса, такие как поддержка универсальных методов.Xamarin.iOS currently has limited support for creating generic subclasses of the NSObject class, such as no support for generic methods. По состоянию на 7.2.1 с помощью универсального подклассы NSObjects возможна, похожее на следующее:As of 7.2.1, using generic subclasses of NSObjects is possible, like this one:

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

Примечание

Хотя универсальные подклассы NSObjects возможны, существуют некоторые ограничения.While generic subclasses of NSObjects are possible, there are a few limitations. Чтение подклассы nsobject Дополнительные сведенияRead the Generic subclasses of NSObject document for more information

Без создания динамического кодаNo Dynamic Code Generation

Так как ядро iOS запрещает приложения динамически создавать код, Xamarin.iOS не поддерживает динамическое создание кода в любой форме.Since the iOS kernel prevents an application from generating code dynamically, Xamarin.iOS does not support any form of dynamic code generation. Сюда входит следующее.These include:

  • System.Reflection.Emit недоступна.The System.Reflection.Emit is not available.
  • Отсутствует поддержка System.Runtime.Remoting.No support for System.Runtime.Remoting.
  • Отсутствует поддержка динамического создания типов (не Type.GetType («MyType "1»)), несмотря на то, что поиск существующих типов (Type.GetType («System.String»), отлично работает).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).
  • Необходимо зарегистрировать обратный обратных вызовов со средой выполнения во время компиляции.Reverse callbacks must be registered with the runtime at compile time.

System.Reflection.EmitSystem.Reflection.Emit

Отсутствие System.Reflection.The lack of System.Reflection. Выдавать означает, что будет работать без кода, который зависит от создания кода среды выполнения.Emit means that no code that depends on runtime code generation will work. Сюда входят, например:This includes things like:

  • Среда выполнения динамического языка.The Dynamic Language Runtime.
  • Любых языков, созданная на основе выполнения динамического языка.Any languages built on top of the Dynamic Language Runtime.
  • TransparentProxy системе удаленного взаимодействия или все, что приведет к среде выполнения динамически создавать код.Remoting's TransparentProxy or anything else that would cause the runtime to generate code dynamically.

Внимание! Не следует путать Reflection.Emit с отражения.Important: Do not confuse Reflection.Emit with Reflection. Reflection.Emit — о создании кода динамически и у этого кода JIT-компилироваться и компилируются в машинный код.Reflection.Emit is about generating code dynamically and have that code JITed and compiled to native code. Из-за ограничения в отношении операций ввода-вывода (без JIT-компиляции) не поддерживается.Due to the limitations on iOS (no JIT compilation) this is not supported.

Но весь API отражения, включая Type.GetType («someClass»), методы, список свойств, получение, атрибуты и значения работает нормально.But the entire Reflection API, including Type.GetType ("someClass"), listing methods, listing properties, fetching attributes and values works just fine.

Использование делегатов для вызова неуправляемых функцийUsing Delegates to call Native Functions

Чтобы вызвать собственную функцию через делегат C#, объявление делегата должен быть снабжен атрибутом один из следующих атрибутов:To call a native function through a C# delegate, the delegate's declaration must be decorated with one of the following attributes:

Не удалось предоставить один из этих атрибутов приведет к ошибку во время выполнения, такие как: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.

Обратный обратные вызовыReverse Callbacks

В стандартных Mono можно передать в неуправляемый код вместо указатель на функцию экземпляры делегата в C#.In standard Mono it is possible to pass C# delegate instances to unmanaged code in lieu of a function pointer. Среда выполнения обычно будет преобразовывать эти указатели функций в небольшой преобразователя, который позволяет неуправляемого кода для обратного вызова в управляемом коде.The runtime would typically transform those function pointers into a small thunk that allows unmanaged code to call back into managed code.

В Mono этих мостах реализуются Just-in-Time компилятора.In Mono these bridges are implemented by the Just-in-Time compiler. При использовании компилятора ahead-of-time, необходимый для iPhone, существуют два важных ограничения на этом этапе:When using the ahead-of-time compiler required by the iPhone there are two important limitations at this point:

  • Необходимо пометить все методы обратного вызова с MonoPInvokeCallbackAttributeYou must flag all of your callback methods with the MonoPInvokeCallbackAttribute
  • Методы должны быть статическими методами, не поддерживается для экземпляра метода.The methods have to be static methods, there is no support for instance methods.

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

Стек удаленного взаимодействия не доступен на Xamarin.iOS.The Remoting stack is not available on Xamarin.iOS.

Среда выполнения отключены функцииRuntime Disabled Features

В iOS Mono среды выполнения были отключены следующие функции:The following features have been disabled in Mono's iOS Runtime:

  • профилировщикProfiler
  • Reflection.EmitReflection.Emit
  • Функциональные возможности Reflection.Emit.SaveReflection.Emit.Save functionality
  • Привязки модели COMCOM bindings
  • JIT-модульThe JIT engine
  • Средство проверки метаданных (поскольку без JIT)Metadata verifier (since there is no JIT)

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

.NET API, предоставляемого — это подмножество полной платформы виде не все, что доступно в iOS.The .NET API exposed is a subset of the full framework as not everything is available in iOS. См. в разделе часто задаваемые вопросы о список сборок, поддерживаемых в настоящее время.See the FAQ for a list of currently supported assemblies.

В частности профиль API, используемый в Xamarin.iOS не входит System.Configuration, поэтому невозможно использовать внешние файлы XML позволяют настроить поведение среды выполнения.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.