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:

  1. Desenvolva um aplicativo UWP (Plataforma Universal do Windows) e teste os builds de depuração do aplicativo para garantir que ele funcione corretamente.

  2. Lidar com o uso de reflexão e serialização adicionais.

  3. Implantar e testar os builds de versão do aplicativo.

  4. 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 .NET Native, examine Migrando seu aplicativo windows 8.x para .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.

  1. 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.

  2. 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 .NET Native superfície 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 o .NET Native tecnologia de pré-compilação. 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:

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 runtime, você poderá recompilar e implantar builds de versão do seu aplicativo. .NET Native binários são colocados no subdiretório ILC.out do diretório especificado na caixa de texto Criar caminho de saída da caixa de diálogo Propriedades do projeto, guia Compilar. Binários que não estão nessa pasta não foram compilados com .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: resolve manualmente os metadados ausentes. Ativar exceções de primeira chance pode ajudá-lo a encontrar esses bugs.

Quando você testou e depurou os builds de depuração do seu aplicativo e está confiante de que eliminou as exceções MissingMetadataException e MissingInteropDataException, deve testar seu aplicativo como um aplicativo de .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 .NET Native que você não encontra na área de trabalho é uma exceção MissingMetadataException, MissingInteropDataException ou MissingRuntimeArtifactException de 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 resolve quaisquer novas exceções MissingMetadataException, MissingInteropDataException e MissingRuntimeArtifactException até não encontrar mais exceções.

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 que decorrem de diferenças na reflexão e na disponibilidade de metadados em aplicativos da área de trabalho e .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:

Confira também