Xamarin.ios의 제한 사항Limitations 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.

다음은 데스크톱 Mono와 비교할 때 Xamarin.ios의 제한 사항입니다.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. 코드는 항상 Just-in-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.object를 사용할 수 없습니다.The System.Reflection.Emit is not available.
  • System.object를 지원 하지 않습니다.No support for System.Runtime.Remoting.
  • 형식을 동적으로 만들 수 없습니다 (예: gettype ("MyType ' 1")). 예를 들어, 기존 형식 (예: 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

시스템 리플렉션이 부족 합니다.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.

  • Remoting의 TransparentProxy 또는 런타임에서 코드를 동적으로 생성 하 게 하는 기타 항목입니다.Remoting's TransparentProxy or anything else that would cause the runtime to generate code dynamically.

    중요

    리플렉션과 리플렉션을 혼동해서는 안 됩니다.Do not confuse Reflection.Emit with Reflection. JITed는 코드를 동적으로 생성 하 고 해당 코드를 네이티브 코드로 컴파일하고 컴파일하는 방법에 대 한 것입니다.Reflection.Emit is about generating code dynamically and have that code JITed and compiled to native code. IOS에 대 한 제한 사항 (JIT 컴파일 없음)으로 인해이는 지원 되지 않습니다.Due to the limitations on iOS (no JIT compilation) this is not supported.

그러나 GetType ("조각이 someclass")을 비롯 한 전체 리플렉션 API (""), 메서드 나열, 속성 나열, 특성 및 값 페치는 정상적으로 작동 합니다.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. IPhone에 필요한 사전 컴파일러를 사용 하는 경우이 시점에는 두 가지 중요 한 제한이 있습니다.When using the ahead-of-time compiler required by the iPhone there are two important limitations at this point:

  • 모든 콜백 메서드에 MonoPInvokeCallbackAttribute 를 사용 하 여 플래그를 지정 해야 합니다.You 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

Mono의 iOS 런타임에서 다음 기능이 사용 하지 않도록 설정 되었습니다.The following features have been disabled in Mono's iOS Runtime:

  • 프로파일러Profiler
  • 리플렉션. 내보내기Reflection.Emit
  • Reflection. 저장 기능Reflection.Emit.Save functionality
  • COM 바인딩COM bindings
  • JIT 엔진The JIT engine
  • 메타 데이터 검증 도구 (JIT가 없기 때문)Metadata verifier (since there is no JIT)

.NET API 제한 사항.NET API Limitations

제공 되는 .NET API는 모든 것이 iOS에서 제공 되는 것이 아니라 전체 프레임 워크의 하위 집합입니다.The .NET API exposed is a subset of the full framework as not everything is available in iOS. 현재 지원 되는 어셈블리 목록은FAQ를 참조 하십시오.See the FAQ for a list of currently supported assemblies.

특히 Xamarin.ios에서 사용 하는 API 프로필에는 System.object가 포함 되어 있지 않으므로 외부 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.