Share via


Xamarin.Mac registrar

Questo documento descrive lo scopo di Xamarin.Mac registrar e le diverse configurazioni di utilizzo.

Panoramica

Xamarin.Mac consente di colmare il divario tra il mondo gestito (.NET) e il runtime di Cocoa, consentendo alle classi gestite di chiamare classi non Objective-C gestite e di essere richiamate quando si verificano eventi. Il lavoro necessario per preformare questa "magia" è gestito da registrar e è, in generale, nascosto dalla visualizzazione.

Ci sono implicazioni per le prestazioni di questa registrazione, in particolare in fase di avvio dell'applicazione, e la comprensione di un po ' di cosa sta succedendo "sotto le quinte" può talvolta essere utile.

Configurazioni

Fondamentalmente il registrarlavoro all'avvio può essere separato in due catagorie:

  • Analizzare ogni classe gestita per individuare le classi derivate da NSObject e raccogliere un elenco di elementi da esporre al Objective-C runtime.
  • Registrare queste informazioni con il Objective-C runtime.

Nel corso del tempo sono state create tre diverse registrar configurazioni per coprire diversi casi d'uso. Ognuna ha diverse conseguenze in fase di compilazione ed esecuzione:

  • Dinamico registrar : durante l'avvio, usare la reflection .NET per analizzare ogni tipo caricato, determinare l'elenco degli elementi pertinenti e informare il runtime nativo. Questa opzione aggiunge zero tempo alla compilazione, ma è molto costoso da calcolare durante l'avvio (fino a più secondi).
  • Statico: registrar durante la compilazione, calcolare il set di elementi da registrare e generare Objective-C codice per gestire la registrazione. Questo codice viene richiamato durante l'avvio per registrare rapidamente tutti gli elementi. Aggiunge una pausa significativa per la compilazione, ma può ridurre una quantità significativa di tempo dall'avvio dell'applicazione.
  • Statico "Parziale" : approccio "ibrido" più recente che offre la maggior parte dei vantaggi di entrambi. Poiché le esportazioni da Xamarin.Mac.dll sono costanti, salvare una libreria precomputata per gestire la registrazione e collegarla. Usare reflection per gestire le librerie utente, ma poiché le librerie utente esportano molti meno tipi che la piattaforma associa questa operazione è spesso piuttosto rapida. Un impatto trascurato sul tempo di compilazione e riduce la maggior parte del "costo" dinamico.

Oggi il valore statico parziale è l'impostazione predefinita per la configurazione di debug e static è l'impostazione predefinita per le configurazioni di versione.

Esistono alcuni scenari:

  • Plug-in caricati dopo l'avvio con classi derivate da NSObject
  • Istanze di classe create dinamicamente che derivano da NSObject

dove l'oggetto registrar non è in grado di sapere che deve registrare un tipo all'inizio. Il ObjCRuntime.Runtime.RegisterAssembly metodo viene fornito per informare l'oggetto registrar che include tipi aggiuntivi da considerare.