Guia de Introdução ao .NET Nativo
Se você estiver escrevendo um novo aplicativo UWP ou migrando um aplicativo existente do Windows 8.x (anteriormente também chamado de aplicativo da Microsoft Store), poderá seguir o mesmo conjunto de procedimentos. Para criar um aplicativo .NET Native, siga estas etapas:
Desenvolva um aplicativo UWP (Plataforma Universal do Windows) e teste os builds de depuração do seu aplicativo para garantir que ele funcione corretamente.
Resolver manualmente os metadados ausentes e repetir a etapa 3 até que todos os problemas sejam resolvidos.
Observação
Se você estiver migrando um aplicativo existente do Windows 8.x para o .NET Native, consulte Migrando seu aplicativo do Windows 8.x para o .NET Native.
Etapa 1: Desenvolver e testar builds de depuração do aplicativo UWP
Se você estiver desenvolvendo um novo aplicativo ou migrando um existente, siga o mesmo processo de qualquer aplicativo do Windows.
Crie um novo projeto UWP no Visual Studio usando o modelo de aplicativo Universal do Windows para Visual C# ou Visual Basic. Por padrão, todos os aplicativos UWP direcionam o CoreCLR e seus builds de versão são compilados usando a cadeia de ferramentas do .NET Native.
Observe que há alguns problemas de compatibilidade conhecidos entre a compilação de projetos de aplicativo UWP com a cadeia de ferramentas do .NET Native e sem ela. Consulte o guia de migração para obter mais informações.
Agora você pode escrever código C# ou Visual Basic na área de superfície do .NET Native que é executada no sistema local (ou no simulador).
Importante
Ao desenvolver seu aplicativo, observe qualquer uso de serialização ou reflexão no seu código.
Por padrão, os builds de depuração são compilados por JIT para habilitar a implantação rápida do F5, enquanto os builds de versão são compilados usando a tecnologia de pré-compilação do .NET Native. Isso significa que você deve criar e testar os builds de depuração do aplicativo para garantir que eles funcionem normalmente antes de compilá-los com a cadeia de ferramentas do .NET Native.
Etapa 2: Lidar com o uso de reflexão e serialização adicionais
Um arquivo de diretivas de runtime, Default.rd.xml, é adicionado automaticamente ao projeto quando ele é criado. Se você desenvolvê-lo no C#, ele será encontrado na pasta Propriedades do projeto. Se você desenvolvê-lo no Visual Basic, ele será encontrado na pasta Meu Projeto do projeto.
Observação
Para obter uma visão geral do processo de compilação do .NET Native que fornece informações de contexto sobre a necessidade de ter um arquivo das diretivas de runtime, consulte .NET Native e compilação.
O arquivo de diretivas de runtime é usado para definir os metadados de que o aplicativo precisa em runtime. Em alguns casos, a versão padrão do arquivo pode ser adequada. No entanto, um código que depende da serialização ou da reflexão pode exigir entradas adicionais no arquivo de diretivas de runtime.
Serialização
Há duas categorias de serializadores e ambas podem necessitar de entradas adicionais no arquivo de diretivas de runtime:
Serializadores não baseado em reflexão. Os serializadores encontrados na biblioteca de classes do .NET Framework, como as classes DataContractSerializer, DataContractJsonSerializer e XmlSerializer, não dependem de reflexão. No entanto, eles necessitam que o código seja gerado com base no objeto a ser serializado ou desserializado. Para obter mais informações, consulte a seção “Serializadores da Microsoft” em Serialização e metadados.
Serializadores de terceiros. Bibliotecas de serialização de terceiros, sendo o mais comum o serializador Newtonsoft JSON, são geralmente baseados em reflexão e requerem entradas no arquivo *.rd.xml para oferecer suporte à serialização e desserialização do objeto. Para obter mais informações, consulte a seção “Serializadores de Terceiros” em Serialização e metadados.
Métodos que dependem de reflexão
Em alguns casos, o uso de reflexão no código não é óbvio. Algumas APIs comuns ou padrões de programação não são consideradas como parte da API de reflexão, mas dependem dela para serem executados com êxito. Isso inclui os seguintes métodos de instanciação do tipo e de construção de método:
O método Type.MakeGenericType
Os métodos Array.CreateInstance e Type.MakeArrayType
O método MethodInfo.MakeGenericMethod.
Para obter mais informações, consulte APIs que dependem de reflexão.
Observação
Nomes de tipo usados em arquivos de diretivas de runtime devem ser totalmente qualificados. Por exemplo, o arquivo deve especificar "System.String" em vez de "String".
Etapa 3: Implantar e testar os builds de versão do aplicativo
Depois de atualizar o arquivo de diretivas de tempo de execução, você pode recompilar e implantar builds de versão do seu aplicativo. Os binários do .NET Native são colocados no subdiretório ILC.out do diretório especificado na caixa de texto Caminho de saída do build da caixa de diálogo Propriedades do projeto, guia Compilar. Os binários que não estão nessa pasta não foram compilados com o .NET Native. Teste o aplicativo por completo e todos os cenários, incluindo cenários de falha, em cada uma de suas plataformas de destino.
Se o aplicativo não funcionar corretamente (especialmente nos casos em que ele gera exceções MissingMetadataException ou MissingInteropDataException em tempo de execução), siga as instruções na próxima seção, Etapa 4: resolver manualmente metadados ausentes. Ativar exceções de primeira chance pode ajudá-lo a encontrar esses bugs.
Depois de testar e depurar os builds de depuração do seu aplicativo e tiver certeza de que eliminou as exceções MissingMetadataException e MissingInteropDataException , você deve testar seu aplicativo como um aplicativo .NET Native otimizado. Para fazer isso, altere as configurações do projeto ativo de Depuração para Versão.
Etapa 4: Resolver manualmente os metadados ausentes
A falha mais comum que você encontrará com o .NET Native que não encontrará na área de trabalho é uma exceção MissingMetadataException, MissingInteropDataException ou MissingRuntimeArtifactException em runtime. Em alguns casos, a ausência de metadados pode manifestar-se em um comportamento imprevisível ou mesmo em falhas de aplicativo. Esta seção discute como depurar e resolver essas exceções adicionando diretivas ao arquivo de diretivas de runtime. Para obter informações sobre o formato das diretivas de runtime, consulte Referência do arquivo de configuração das diretivas de runtime (rd.xml). Depois de adicionar diretivas de runtime, você deve implantar e testar seu aplicativo novamente e resolver todas as novas exceções MissingMetadataException, MissingInteropDataException e MissingRuntimeArtifactException até encontrar
Dica
Especifique as diretivas de runtime em um nível superior para permitir que seu aplicativo seja resistente a alterações de código. É recomendável adicionar diretivas de runtime nos níveis de namespace e tipo em vez de nível do membro. Observe que pode haver uma relação entre resiliência e binários maiores com mais tempo de compilação.
Ao lidar com uma exceção de metadados ausentes, considere esses problemas:
O que o aplicativo estava tentando fazer antes da exceção?
- Por exemplo, ele estava associando dados, serializando ou desserializando dados ou usando diretamente a API de reflexão?
Trata-se de um caso isolado ou você acredita que encontrará o mesmo problema para outros tipos?
- Por exemplo, uma exceção MissingMetadataException é gerada ao serializar um tipo no modelo de objeto do aplicativo. Se você souber que outros tipos serão serializados, poderá adicionar diretivas de runtime para esses tipos (ou para seus namespaces recipientes, dependendo de como o código é organizado) ao mesmo tempo.
Você pode reescrever o código para que ele não use reflexão?
Por exemplo, o código usa a palavra-chave
dynamic
quando você sabe qual tipo esperar?O código chama um método que depende de reflexão quando alguma alternativa melhor está disponível?
Observação
Para obter informações adicionais sobre como lidar com problemas decorrentes de diferenças na reflexão e na disponibilidade de metadados em aplicativos da área de trabalho e no .NET Native, consulte APIs que dependem da reflexão.
Para ver alguns exemplos específicos de como lidar com exceções e outros problemas que ocorrem ao testar seu aplicativo, consulte: