Xamarin.Mac registrar

En este documento, se describe el propósito de Xamarin.Mac registrar y sus diferentes configuraciones de uso.

Información general

Xamarin.Mac actúa como un puente para la brecha entre el mundo administrado (.NET) y el runtime de Cocoa, lo que permite que las clases administradas llamen a clases Objective-C no administradas, y se vuelvan a llamar cuando se produzcan eventos. El trabajo necesario para realizar esta "magia" se controla mediante registrar y es, en general, oculto.

Este registro repercute en el rendimiento, concretamente en el tiempo de arranque de la aplicación, y a veces puede ser útil entender un poco lo que ocurre "bajo el capó".

Configurations

Fundamentalmente, el trabajo de registrar en el inicio se puede separar en dos categorías:

  • Examine cada clase administrada en busca de las que derivan de NSObject y recopile una lista de elementos que se expondrán al runtime de Objective-C.
  • Registre esta información con el runtime de Objective-C.

Con el tiempo, se han creado tres configuraciones diferentes de registrar para cubrir diferentes casos de uso. Cada una tiene diferentes consecuencias en términos de runtime y ejecución:

  • Dinámico registrar: durante el inicio, use la reflexión de .NET para examinar cada tipo cargado, determinar la lista de elementos pertinentes e informar al runtime nativo. Esta opción agrega tiempo cero a la compilación, pero esto resulta muy caro de calcular durante el inicio (hasta varios segundos).
  • Estático registrar: durante la compilación, calcule el conjunto de elementos que se van a registrar y genere código de Objective-C para controlar el registro. Este código se invoca durante el inicio para registrar rápidamente todos los elementos. Agrega una pausa significativa a la compilación, pero puede reducir una cantidad significativa de tiempo desde el inicio de la aplicación.
  • Estático "parcial": un enfoque "híbrido" más reciente que aporta la mayor parte de las ventajas de ambos. Dado que las exportaciones de Xamarin.Mac.dll son constantes, guarde una biblioteca precalculada para controlar su registro y vincularlo. Use la reflexión para controlar las bibliotecas de usuario, pero, a medida que las bibliotecas de usuario exportan muchos menos tipos que los enlaces de la plataforma, esto suele ser más rápido. Un impacto mínimo en el tiempo de compilación y reduce la mayor parte del "costo" de la dinámica.

Hoy en día, "estático parcial" es el valor predeterminado para la configuración de depuración y "estático" es el valor predeterminado para las configuraciones de versión.

Hay algunos escenarios:

  • Complementos cargados después del inicio con clases derivadas de NSObject
  • Instancias de clase creadas dinámicamente derivadas de NSObject

donde registrar no puede saber que necesita registrar algún tipo al principio. El método ObjCRuntime.Runtime.RegisterAssembly se proporciona para informar de que registrar tiene tipos adicionales que se deben tener en cuenta.