Limitações do Xamarin.iOS
Como os aplicativos que usam o Xamarin.iOS são compilados para código estático, não é possível usar nenhuma instalação que exija a geração de código em runtime.
Essas são as limitações do Xamarin.iOS em comparação com o Mono da área de trabalho:
Suporte a genéricos limitados
Ao contrário do Mono/.NET tradicional, o código no iPhone é compilado estaticamente antecipadamente em vez de ser compilado sob demanda por um compilador JIT.
A tecnologia AOT Completa do Mono tem algumas limitações em relação aos genéricos, elas são causadas porque nem todas as instâncias genéricas possíveis podem ser determinadas antecipadamente no momento da compilação. Isso não é um problema para runtimes regulares do .NET ou mono, pois o código é sempre compilado em runtime usando o compilador Just in Time. Mas isso representa um desafio para um compilador estático como o Xamarin.iOS.
Alguns dos problemas comuns que os desenvolvedores executam incluem:
Subclasses genéricas de NSObjects são limitadas
Atualmente, o Xamarin.iOS tem suporte limitado para criar subclasses genéricas da classe NSObject, como sem suporte para métodos genéricos. A partir da 7.2.1, é possível usar subclasses genéricas de NSObjects, como esta:
class Foo<T> : UIView {
[..]
}
Observação
Embora subclasses genéricas de NSObjects sejam possíveis, há algumas limitações. Leia as subclasses genéricas do documento NSObject para obter mais informações
Sem geração de código dinâmico
Como o kernel do iOS impede que um aplicativo gere código dinamicamente, o Xamarin.iOS não dá suporte a nenhuma forma de geração dinâmica de código. Estão incluídos:
- O System.Reflection.Emit não está disponível.
- Não há suporte para System.Runtime.Remoting.
- Não há suporte para criar tipos dinamicamente (sem Type.GetType ("MyType'1")), embora a pesquisa de tipos existentes (Type.GetType ("System.String") por exemplo, funcione muito bem).
- Os retornos de chamada reversos devem ser registrados com o runtime em tempo de compilação.
System.Reflection.Emit
A falta de System.Reflection. Emitir significa que nenhum código que dependa da geração de código de runtime funcionará. Isso inclui itens como:
O Dynamic Language Runtime.
Todos os idiomas criados sobre o Dynamic Language Runtime.
TransparentProxy da comunicação remota ou qualquer outra coisa que faça com que o runtime gere código dinamicamente.
Importante
Não confunda Reflection.Emit com Reflection. Reflection.Emit é sobre gerar código dinamicamente e ter esse código JITed e compilado para código nativo. Devido às limitações no iOS (sem compilação JIT), não há suporte para isso.
Mas toda a API reflection, incluindo Type.GetType ("someClass"), listando métodos, listando propriedades, buscando atributos e valores funciona muito bem.
Usando delegados para chamar funções nativas
Para chamar uma função nativa por meio de um delegado C#, a declaração do delegado deve ser decorada com um dos seguintes atributos:
- UnmanagedFunctionPointerAttribute (preferencial, pois é multiplataforma e compatível com o .NET Standard 1.1+)
- MonoNativeFunctionWrapperAttribute
Não fornecer um desses atributos resultará em um erro de runtime, como:
System.ExecutionEngineException: Attempting to JIT compile method '(wrapper managed-to-native) YourClass/YourDelegate:wrapper_aot_native(object,intptr,intptr)' while running in aot-only mode.
Retornos de chamada reversos
No Mono padrão, é possível passar instâncias de delegado C# para código não gerenciado em vez de um ponteiro de função. O runtime normalmente transformaria esses ponteiros de função em um pequeno thunk que permite que o código não gerenciado chame de volta para o código gerenciado.
No Mono, essas pontes são implementadas pelo compilador Just-in-Time. Ao usar o compilador antecipadamente exigido pelo iPhone, há duas limitações importantes neste ponto:
- Você deve sinalizar todos os seus métodos de retorno de chamada com MonoPInvokeCallbackAttribute
- Os métodos precisam ser métodos estáticos, não há suporte para métodos de instância.
Sem comunicação remota
A pilha de comunicação remota não está disponível no Xamarin.iOS.
Recursos desabilitados do runtime
Os seguintes recursos foram desabilitados no Runtime do iOS do Mono:
- Criador de perfil
- Reflection.Emit
- Funcionalidade Reflection.Emit.Save
- Associações COM
- O mecanismo JIT
- Verificador de metadados (já que não há JIT)
Limitações da API do .NET
A API do .NET exposta é um subconjunto da estrutura completa, pois nem tudo está disponível no iOS. Confira as perguntas frequentes para obter uma lista de assemblies com suporte no momento.
Em particular, o perfil de API usado pelo Xamarin.iOS não inclui System.Configuration, portanto, não é possível usar arquivos XML externos para configurar o comportamento do runtime.