Регистратор Xamarin.MacXamarin.Mac registrar

В этом документе описано назначение регистратор Xamarin.Mac и его различных способов использования конфигураций.This document describes the purpose of the Xamarin.Mac registrar and its different usage configurations.

ОбзорOverview

Xamarin.Mac ликвидирует разрыв между управляемым миром (.NET) и среды выполнения Cocoa, позволяя управляемых классов для вызова неуправляемых классов Objective-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. Работ, необходимый для выполнения «волшебных» обрабатывается регистратор и вообще говоря, скрыто от просмотра.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 и сбора списка элементов в среде выполнения Objective-C.Scan every managed class for those deriving from NSObject and collect a list of items to be exposed to the Objective-C runtime.
  • Зарегистрируйте эту информацию в среде выполнения Objective-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. Этот параметр добавляет нулевым временем сборки, но является очень ресурсоемким для вычисления во время запуска (до нескольких секунд).This option adds zero time to the build but is very expensive to compute during launch (up to multiple seconds).
  • Статические регистратора — во время сборки, вычисления набора элементов, регистрироваться и создавать код Objective-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.
  • «Частичных» static — новой подход «смешанный», что дает большую часть преимущества обоих."Partial" static – A newer "hybrid" approach which brings most of the advantages of both. С момента экспорты из Xamarin.Mac.dll являются постоянными, Сохранить библиотеку предварительно вычисляемых для обработки их регистрации и привязки, в.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 создавать временные затраты на и снижает подавляющее большинство случаев «стоимость» dynamic.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:

  • Подключаемые модули загружаются после запуска классов, производных от NSObjectPlugins loaded after launch with classes deriving from NSObject
  • Динамически созданные экземпляры класса, производное от NSObjectDynamically 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.