Xamarin.Mac registrar

Este documento descreve a finalidade do Xamarin.Mac registrar e suas diferentes configurações de uso.

Visão geral

O Xamarin.Mac faz a ponte entre o mundo gerenciado (.NET) e o runtime do Cocoa, permitindo que as classes gerenciadas chamem classes não gerenciadas Objective-C e sejam chamadas de volta quando ocorrerem eventos. O trabalho necessário para pré-formatar essa "mágica" é tratado pelo registrar e está, em geral, oculto da exibição.

Há implicações de desempenho desse registro, especificamente no tempo de inicialização do aplicativo, e entender um pouco do que está acontecendo "nos bastidores" às vezes pode ser útil.

Configurações

Fundamentalmente, o registrartrabalho do na inicialização pode ser separado em dois catagories:

  • Examine todas as classes gerenciadas para aquelas derivadas de NSObject e colete uma lista de itens a serem expostos ao Objective-C runtime.
  • Registre essas informações com o Objective-C runtime.

Ao longo do tempo, três configurações diferentes registrar foram criadas para abranger diferentes casos de uso. Cada um tem consequências de tempo de execução e build diferentes:

  • Dinâmico registrar – Durante a inicialização, use a reflexão do .NET para examinar cada tipo carregado, determinar a lista de itens relevantes e informar o runtime nativo. Essa opção adiciona zero tempo ao build, mas é muito cara para computar durante a inicialização (até vários segundos).
  • Estático registrar – Durante o build, calcule o conjunto de itens a serem registrados e gere Objective-C código para manipular o registro. Esse código é invocado durante a inicialização para registrar rapidamente todos os itens. Adiciona uma pausa significativa para compilar, mas pode reduzir uma quantidade significativa de tempo desde o início do aplicativo.
  • Estático "parcial" – uma abordagem "híbrida" mais recente que traz a maioria das vantagens de ambos. Como as exportações de Xamarin.Mac.dll são constantes, salve uma biblioteca pré-computada para lidar com o registro e vinculá-lo. Use reflexão para lidar com bibliotecas de usuários, mas à medida que as bibliotecas de usuário exportam muito menos tipos que a plataforma associa, isso geralmente é bastante rápido. Um impacto negligenciado no tempo de build e reduz a grande maioria do "custo" da dinâmica.

Hoje estática parcial é o padrão para a configuração de Depuração e Estático é o padrão para configurações de versão.

Há alguns cenários:

  • Plug-ins carregados após a inicialização com classes derivadas de NSObject
  • Instâncias de classe criadas dinamicamente derivadas de NSObject

em que o registrar não consegue saber que precisa registrar algum tipo no início. O ObjCRuntime.Runtime.RegisterAssembly método é fornecido para informar que registrar ele tem tipos adicionais a serem considerados.