Xamarin.ios 등록 기관Xamarin.Mac registrar

이 문서에서는 Xamarin.ios 등록 기관의 용도와 다양 한 사용 구성에 대해 설명 합니다.This document describes the purpose of the Xamarin.Mac registrar and its different usage configurations.

개요Overview

Xamarin.ios는 관리 되는 (.NET) 세계와 Cocoa의 런타임 간 격차를 연결 하 여 관리 되는 클래스가 관리 되지 않는 목표-C 클래스를 호출 하 고 이벤트가 발생할 때 다시 호출 될 수 있도록 합니다.Xamarin.Mac bridges the gap between the managed (.NET) world and Cocoa's runtime, allowing managed classes to call unmanaged Objective-C classes and be called back when events occur. 이 "magic"을 수행 하는 데 필요한 작업은 등록자에 의해 처리 되며 일반적으로 보기에서 숨겨집니다.The work required to preform this “magic” is handled by the registrar and is, in general, hidden from view.

특히 응용 프로그램 시작 시간에 이러한 등록에 대 한 성능 영향을 받고 "내부적으로" 진행 상황을 이해 하는 것이 도움이 될 수 있습니다.There are performance implications of this registration, specifically on application start up time, and understanding a bit of what's going on "under the hood" can sometimes be helpful.

구성Configurations

기본적으로 시작 시 등록자의 작업은 다음과 같은 두 개의 범주으로 구분할 수 있습니다.Fundamentally the registrar’s job at startup can be separated into two catagories:

  • NSObject에서 파생 되는 모든 관리 되는 클래스를 검색 하 고 목표-C 런타임에 노출 될 항목 목록을 수집 합니다.Scan every managed class for those deriving from NSObject and collect a list of items to be exposed to the Objective-C runtime.
  • 이 정보를 목표-C 런타임으로 등록 합니다.Register this information with the Objective-C runtime.

시간이 지남에 따라 다양 한 사용 사례를 포함 하기 위해 세 가지 등록자 구성이 생성 되었습니다.Over time, three different registrar configurations have been created to cover different use cases. 각각에는 서로 다른 빌드 및 런타임 결과가 있습니다.Each has different build and run time consequences:

  • 동적 등록 기관 – 시작 하는 동안 .net 리플렉션을 사용 하 여 로드 된 모든 형식을 검색 하 고, 관련 항목의 목록을 확인 하 고, 네이티브 런타임에 알립니다.Dynamic registrar – During startup, use .NET reflection to scan every loaded type, determine the list of relevant items, and inform the native runtime. 이 옵션은 빌드에 0 시간을 추가 하지만 시작 중 계산 하는 데 비용이 많이 듭니다 (최대 여러 초).This option adds zero time to the build but is very expensive to compute during launch (up to multiple seconds).
  • 정적 등록 기관 – 빌드하는 동안 등록할 항목 집합을 계산 하 고 등록을 처리할 목표 C 코드를 생성 합니다.Static registrar – During build, compute the set of items to be registered and generate Objective-C code to handle registration. 이 코드는 시작 하는 동안 호출 되어 모든 항목을 빠르게 등록 합니다.This code is invoked during startup to quickly register all items. 빌드에 상당한 일시 중지를 추가 하지만 응용 프로그램 시작에서 상당한 시간을 줄일 수 있습니다.Adds a significant pause to build but can cut a significant amount of time from application start.
  • "부분" 정적 – 둘 다의 장점을 최대한 활용 하는 최신 "하이브리드" 접근 방식입니다."Partial" static – A newer "hybrid" approach which brings most of the advantages of both. Xamarin.ios 에서 내보내기는 일정 하므로에서 등록 및 링크를 처리 하는 사전 계산 라이브러리를 저장 합니다.Since the exports from Xamarin.Mac.dll are constant, save a precomputed library to handle their registration and link that in. 리플렉션을 사용 하 여 사용자 라이브러리를 처리 하지만, 사용자 라이브러리는 플랫폼 바인딩에서이를 신속 하 게 사용 하는 것 보다 훨씬 더 작은 형식을 내보냅니다.Use reflection to handle user libraries, but as user libraries export much fewer types that the platform bindings this is often rather quick. Neglectable 빌드 시간이 영향을 주며 동적의 "비용" 대부분이 줄어듭니다.A neglectable build time impact and reduces a vast majority of the “cost” of dynamic.

오늘 부분 고정은 디버그 구성의 기본값 이며 고정은 릴리스 구성에 대 한 기본값입니다.Today partial static is the default for Debug configuration and Static is the default for Release configurations.

다음과 같은 몇 가지 시나리오가 있습니다.There are some scenarios:

  • NSObject에서 파생 된 클래스를 사용 하 여 시작한 후 플러그 인 로드Plugins loaded after launch with classes deriving from NSObject
  • NSObject에서 파생 되는 동적으로 생성 되는 클래스 인스턴스Dynamically created class instances deriving from NSObject

등록자는 시작 시 일부 형식을 등록 해야 한다는 것을 알 수 없습니다.where the registrar is unable to know that it needs to register some type at start. 등록자에 게 고려할 추가 형식이 있음을 알리기 위해 ObjCRuntime.Runtime.RegisterAssembly 메서드가 제공 됩니다.The ObjCRuntime.Runtime.RegisterAssembly method is provided to inform the registrar that it has additional types to consider.