Xamarin.iOS의 제한 사항
Xamarin.iOS를 사용하는 애플리케이션은 정적 코드로 컴파일되므로 런타임에 코드를 생성해야 하는 기능을 사용할 수 없습니다.
다음은 데스크톱 Mono에 비해 Xamarin.iOS 제한 사항입니다.
제한된 제네릭 지원
기존의 Mono/.NET과 달리 i전화 코드는 JIT 컴파일러에서 요청 시 컴파일되는 대신 미리 정적으로 컴파일됩니다.
Mono의 전체 AOT 기술에는 제네릭과 관련하여 몇 가지 제한 사항이 있으며, 이는 가능한 모든 제네릭 인스턴스화를 컴파일 시간에 미리 확인할 수 없기 때문에 발생합니다. 코드는 항상 Just in Time 컴파일러를 사용하여 런타임에 컴파일되므로 일반 .NET 또는 Mono 런타임에는 문제가 되지 않습니다. 그러나 이 경우 Xamarin.iOS와 같은 정적 컴파일러에 문제가 발생합니다.
개발자가 발생하는 일반적인 문제 중 일부는 다음과 같습니다.
NSObjects의 제네릭 서브클래스는 제한됩니다.
Xamarin.iOS는 현재 NSObject 클래스의 제네릭 서브클래스를 만들기 위한 지원이 제한되어 있습니다(예: 제네릭 메서드에 대한 지원 없음). 7.2.1을 기준으로 다음과 같이 NSObjects의 제네릭 서브클래스를 사용할 수 있습니다.
class Foo<T> : UIView {
[..]
}
참고 항목
NSObjects의 제네릭 서브클래스는 가능하지만 몇 가지 제한 사항이 있습니다. 자세한 내용은 NSObject 문서의 제네릭 하위 클래스를 참조하세요.
동적 코드 생성 없음
iOS 커널은 애플리케이션이 코드를 동적으로 생성할 수 없으므로 Xamarin.iOS는 어떠한 형태의 동적 코드 생성도 지원하지 않습니다. 여기에는 다음이 포함됩니다.
- System.Reflection.Emit을 사용할 수 없습니다.
- System.Runtime.Remoting에 대한 지원이 없습니다.
- 형식을 동적으로 만들 수 없습니다(Type.GetType("MyType'1"). 기존 형식을 조회하더라도(예: Type.GetType("System.String") 잘 작동함).
- 역방향 콜백은 컴파일 시간에 런타임에 등록해야 합니다.
System.Reflection.Emit
System.Reflection이 부족합니다. 내보내기 란 런타임 코드 생성에 의존하는 코드가 작동하지 않음을 의미합니다. 여기에는 다음과 같은 항목이 포함됩니다.
동적 언어 런타임입니다.
동적 언어 런타임을 기반으로 빌드된 모든 언어입니다.
Remoting의 TransparentProxy 또는 런타임이 동적으로 코드를 생성하게 하는 기타 항목입니다.
Important
Reflection.Emit과 리플렉션을 혼동하지 마세요. Reflection.Emit는 동적으로 코드를 생성하고 해당 코드를 JITed하고 네이티브 코드로 컴파일하는 방법에 관한 것입니다. iOS의 제한 사항(JIT 컴파일 없음)으로 인해 지원되지 않습니다.
그러나 Type.GetType("someClass"), 나열 메서드, 속성 나열, 특성 및 값 가져오기를 포함한 전체 리플렉션 API는 잘 작동합니다.
대리자를 사용하여 네이티브 함수 호출
C# 대리자를 통해 네이티브 함수를 호출하려면 대리자의 선언을 다음 특성 중 하나로 데코레이트해야 합니다.
- UnmanagedFunctionPointerAttribute (플랫폼 간이며 .NET Standard 1.1 이상과 호환되므로 기본 설정)
- MonoNativeFunctionWrapperAttribute
이러한 특성 중 하나를 제공하지 않으면 다음과 같은 런타임 오류가 발생합니다.
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에서 이러한 브리지는 Just-In-Time 컴파일러에 의해 구현됩니다. i전화 필요한 미리 컴파일러를 사용하는 경우 이 시점에서 두 가지 중요한 제한 사항이 있습니다.
- MonoPInvokeCallbackAttribute를 사용하여 모든 콜백 메서드에 플래그를 지정해야 합니다.
- 메서드는 정적 메서드여야 하며 인스턴스 메서드에 대한 지원은 없습니다.
원격 없음
원격 스택은 Xamarin.iOS에서 사용할 수 없습니다.
런타임 사용 안 함 기능
Mono의 iOS 런타임에서는 다음 기능을 사용하지 않도록 설정했습니다.
- 프로파일러
- Reflection.Emit
- Reflection.Emit.Save 기능
- COM 바인딩
- JIT 엔진
- 메타데이터 검증 도구(JIT가 없으므로)
.NET API 제한 사항
노출되는 .NET API는 iOS에서 모든 것을 사용할 수 있는 것은 아니기 때문에 전체 프레임워크의 하위 집합입니다. 현재 지원되는 어셈블리 목록은 FAQ 를 참조하세요.
특히 Xamarin.iOS에서 사용하는 API 프로필에는 System.Configuration이 포함되지 않으므로 외부 XML 파일을 사용하여 런타임의 동작을 구성할 수 없습니다.