Xamarin.Mac registrar

Ce document décrit l’objectif de Xamarin.Mac registrar et ses différentes configurations d’utilisation.

Vue d’ensemble

Xamarin.Mac comble l’écart entre le monde managé (.NET) et le runtime de Cocoa, ce qui permet aux classes managées d’appeler des classes non managées et d’être rappelées Objective-C lorsque des événements se produisent. Le travail requis pour préformer cette « magie » est géré par et registrar est, en général, masqué.

Cette inscription a des répercussions sur les performances, en particulier sur le temps de démarrage de l’application, et la compréhension d’un peu de ce qui se passe « sous le capot » peut parfois être utile.

Configurations

Fondamentalement, le registrartravail de la start-up peut être séparé en deux catagories :

  • Analysez chaque classe managée pour celles qui dérivent de NSObject et collectez une liste d’éléments à exposer au Objective-C runtime.
  • Inscrivez ces informations auprès du Objective-C runtime.

Au fil du temps, trois configurations différentes registrar ont été créées pour couvrir différents cas d’usage. Chacune a des conséquences sur le temps de génération et d’exécution :

  • Dynamique registrar – Au démarrage, utilisez la réflexion .NET pour analyser chaque type chargé, déterminer la liste des éléments pertinents et informer le runtime natif. Cette option ajoute zéro temps à la build, mais est très coûteuse à calculer pendant le lancement (jusqu’à plusieurs secondes).
  • Statique registrar – Pendant la génération, calculez l’ensemble des éléments à inscrire et générez le Objective-C code pour gérer l’inscription. Ce code est appelé au démarrage pour inscrire rapidement tous les éléments. Ajoute une pause importante à la génération, mais peut réduire un temps important à partir du démarrage de l’application.
  • Statique « partielle » : approche « hybride » plus récente qui apporte la plupart des avantages des deux. Étant donné que les exportations de Xamarin.Mac.dll sont constantes, enregistrez une bibliothèque précalculée pour gérer leur inscription et lier celle-ci dans. Utilisez la réflexion pour gérer les bibliothèques utilisateur, mais comme les bibliothèques utilisateur exportent beaucoup moins de types que la plateforme lie, cela est souvent assez rapide. Un impact de temps de construction négligent et réduit une grande majorité du « coût » de la dynamique.

Aujourd’hui, la statique partielle est la valeur par défaut pour la configuration Debug et Static est la valeur par défaut pour les configurations Release.

Il existe quelques scénarios :

  • Plug-ins chargés après le lancement avec des classes dérivées de NSObject
  • Instances de classe créées dynamiquement à partir de NSObject

où n’est registrar pas en mesure de savoir qu’il doit inscrire un type au début. La ObjCRuntime.Runtime.RegisterAssembly méthode est fournie pour informer le registrar qu’elle a d’autres types à prendre en compte.