Xamarin.Mac registrar

이 문서에서는 Xamarin.Mac registrar 의 목적과 다양한 사용 구성에 대해 설명합니다.

개요

Xamarin.Mac은 관리되는(.NET) 세계와 Cocoa의 런타임 간의 격차를 해소하여 관리되는 클래스가 관리 Objective-C 되지 않는 클래스를 호출하고 이벤트가 발생할 때 다시 호출할 수 있도록 합니다. 이 "매직" registrar 을 미리 포맷하는 데 필요한 작업은 일반적으로 보기에서 숨겨져 있습니다.

특히 애플리케이션 시작 시간에는 이 등록의 성능에 영향을 미치며, "내부적으로" 진행 중인 작업을 약간 이해하는 것이 도움이 될 수 있습니다.

구성

기본적으로 시작 시 registrar의 작업은 다음 두 개의 범주로 구분할 수 있습니다.

  • NSObject에서 파생되는 모든 관리되는 클래스를 검색하고 런타임에 노출 Objective-C 될 항목 목록을 수집합니다.
  • 런타임에 이 정보를 등록합니다 Objective-C .

시간이 지남에 따라 다양한 사용 사례를 다루기 위해 세 registrar 가지 구성이 만들어졌습니다. 각 빌드 및 런타임 결과는 서로 다릅니다.

  • 동적 registrar – 시작하는 동안 .NET 리플렉션을 사용하여 로드된 모든 형식을 검사하고, 관련 항목 목록을 확인하고, 네이티브 런타임에 알립니다. 이 옵션은 빌드에 0시간을 추가하지만 시작하는 동안 계산하는 데 비용이 매우 많이 듭니다(최대 몇 초).
  • 정적 registrar – 빌드하는 동안 등록할 항목 집합을 계산하고 등록을 처리하는 코드를 생성 Objective-C 합니다. 이 코드는 모든 항목을 빠르게 등록하기 위해 시작하는 동안 호출됩니다. 빌드에 상당한 일시 중지를 추가하지만 애플리케이션 시작부터 상당한 시간을 줄일 수 있습니다.
  • "부분" 정적 – 둘 다의 장점을 대부분 제공하는 최신 "하이브리드" 접근 방식입니다. Xamarin.Mac.dll 내보내기가 상수이므로 사전 계산된 라이브러리를 저장하여 등록을 처리하고 연결합니다. 리플렉션을 사용하여 사용자 라이브러리를 처리하지만 사용자 라이브러리가 훨씬 적은 형식을 내보내면 플랫폼 바인딩이 다소 빠른 경우가 많습니다. 무시 가능한 빌드 시간 영향 및 동적의 "비용"의 대부분을 줄일 수 있습니다.

현재 부분 정적은 디버그 구성의 기본값이며 정적은 릴리스 구성의 기본값입니다.

몇 가지 시나리오가 있습니다.

  • NSObject에서 파생된 클래스를 사용하여 실행 후 로드된 플러그 인
  • NSObject에서 파생되는 동적으로 만든 클래스 인스턴스

registrar 여기서는 시작 시 일부 형식을 등록해야 한다는 것을 알 수 없습니다. 이 ObjCRuntime.Runtime.RegisterAssembly 메서드는 고려해야 할 추가 형식이 registrar 있음을 알리기 위해 제공됩니다.