Introducción a .NET Native

Tanto si estás escribiendo una nueva aplicación para UWP como si vas a migrar una aplicación de Windows 8.x existente (anteriormente denominada aplicación de Microsoft Store), puedes seguir el mismo conjunto de procedimientos. Para crear una aplicación de .NET Native, siga estos pasos:

  1. Desarrolle una aplicación de Plataforma universal de Windows (UWP) y pruebe las compilaciones de depuración de la aplicación para asegurarse de que funciona correctamente.

  2. Administre el uso de reflexión y serialización adicionales.

  3. Implemente y pruebe las compilaciones de lanzamiento de la aplicación.

  4. Resuelva manualmente los metadatos que faltan y repita el paso 3 hasta que todos los problemas estén solucionados.

Nota:

Si va a migrar una aplicación de Windows 8.x existente a .NET Native, asegúrese de revisar Migrar la aplicación de Windows 8.x a .NET Native.

Paso 1: desarrollar y probar compilaciones de depuración de la aplicación de UWP

Tanto si va a desarrollar una nueva aplicación o migrar una ya existente, el procedimiento es el mismo para cualquier aplicación de Windows.

  1. Crear un nuevo proyecto de UWP en Visual Studio mediante la plantilla de aplicación universal de Windows para Visual C# o Visual Basic. De forma predeterminada, todas las aplicaciones de UWP tienen como destino CoreCLR y sus versiones de lanzamiento se compilan con la cadena de herramientas de .NET Native.

  2. Tenga en cuenta que existen algunos problemas de compatibilidad conocidos entre la compilación de proyectos de aplicaciones de UWP con la cadena de herramientas de .NET Native y sin ella. Consulte la guía de migración para más información.

Ahora puede escribir código de C# o Visual Basic en el área expuesta .NET Native que se ejecuta en el sistema local (o en el simulador).

Importante

A medida que vaya desarrollando la aplicación, anote cualquier uso de serialización o reflexión en el código.

De forma predeterminada, las compilaciones de depuración se compilan JIT para habilitar la implementación rápida de F5, mientras que las compilaciones de versión se compilan mediante la tecnología de compilación previa .NET Native. Esto significa que debe compilar y probar las compilaciones de depuración de la aplicación para asegurarse de que funcionan normalmente antes de compilarlas con la cadena de herramientas de .NET Native.

Paso 2: Administrar el uso de reflexión y serialización adicionales

Se agrega de forma automática un archivo de directivas en tiempo de ejecución, Default.rd.xml, al proyecto cuando lo crea. Si desarrolla en C#, se encuentra en la carpeta Propiedades de su proyecto. Si desarrolla en Visual Basic, se encuentra en la carpeta Mi proyecto de su proyecto.

Nota:

Para obtener información general acerca del proceso de compilación de .NET Native que proporciona información general sobre por qué se necesita un archivo de directivas en tiempo de ejecución, consulte .NET Native y compilación.

El archivo de directivas en tiempo de ejecución se usa para definir los metadatos que necesita la aplicación en tiempo de ejecución. En algunos casos, la versión predeterminada del archivo puede ser adecuada. Sin embargo, es posible que algunos códigos que se basan en la serialización o la reflexión requieran entradas adicionales en el archivo de directivas en tiempo de ejecución.

Serialización

Existen dos categorías de serializadores y ambas pueden requerir entradas extra en el archivo de directivas en tiempo de ejecución:

  • Serializadores no basados en la reflexión. Los serializadores de la biblioteca de clases .NET Framework, como las clases DataContractSerializer, DataContractJsonSerializery XmlSerializer , no usan reflexión. Sin embargo, requieren que el código se genere en función del objeto que se va a serializar o deserializar. Para más información, consulte la sección "Serializadores de Microsoft" en Serialization and Metadata.

  • Serializadores de terceros. Las bibliotecas de serialización de terceros (de las cuales el serializador JSON Newtonsoft es la más común), están generalmente basadas en la reflexión y requieren entradas en el archivo *.rd.xml para dar cabida a la serialización y deserialización de objetos. Para más información, vea la sección "Serializadores de terceros" en Serialization and Metadata.

Métodos basados en la reflexión

En algunos casos, el uso de reflexión en el código no es obvio. Algunas API comunes o patrones de programación no se consideran parte de la API de reflexión, pero se basan en la reflexión para ejecutarse correctamente. Esto incluye los siguientes métodos de creación de instancias de tipo y de construcción de métodos:

Para obtener más información, consulta APIs That Rely on Reflection.

Nota:

Los nombres de tipo que se usan en los archivos de directivas en tiempo de ejecución deben ser nombres completos. Por ejemplo, el archivo debe mostrar "System.String" en lugar de "String".

Paso 3: implementar y probar las compilaciones de lanzamiento de la aplicación

Después de actualizar el archivo de directivas en tiempo de ejecución, puede recompilar e implementar compilaciones de versión de la aplicación. .NET Native archivos binarios se colocan en el subdirectorio ILC.out del directorio especificado en el cuadro de texto Ruta de acceso de salida de compilación del cuadro de diálogo Propiedades del proyecto, pestaña Compilar. Los archivos binarios que no están en esta carpeta no se han compilado con .NET Native. Pruebe la aplicación exhaustivamente y pruebe todos los escenarios, incluidos los escenarios de error, en cada una de las plataformas de destino.

Si la aplicación no funciona correctamente (especialmente en los casos en los que produce excepciones MissingMetadataException o MissingInteropDataException en tiempo de ejecución), siga las instrucciones de la sección siguiente, Paso 4: Resolver manualmente los metadatos que faltan. Habilitar las primeras excepciones puede ayudarle a encontrar estos errores.

Cuando haya probado y depurado las compilaciones de depuración de la aplicación y esté seguro de que ha eliminado las excepciones MissingMetadataException y MissingInteropDataException, debe probar la aplicación como una aplicación de .NET Native optimizada. Para ello, cambie la configuración del proyecto activo de Depurar a Liberar.

Paso 4: Resolver manualmente los metadatos que faltan

El error más común que encontrará con .NET Native que no encuentre en el escritorio es una excepción MissingMetadataException, MissingInteropDataException o MissingRuntimeArtifactException en tiempo de ejecución. En algunos casos, la ausencia de metadatos se puede manifestar en un comportamiento impredecible o, incluso, en errores de la aplicación. En esta sección se describe cómo puede depurar y resolver estas excepciones agregando directivas al archivo de directivas en tiempo de ejecución. Para obtener información sobre el formato de las directivas de tiempo de ejecución, vea Referencia del archivo de configuración de directivas en tiempo de ejecución (rd.xml). Después de agregar directivas en tiempo de ejecución, debe implementar y probar la aplicación de nuevo y resolver las nuevas excepciones MissingMetadataException, MissingInteropDataException y MissingRuntimeArtifactException hasta que no encuentre más excepciones.

Sugerencia

Especifique las directivas en tiempo de ejecución en un nivel elevado para que la aplicación sea resistente a los cambios de código. Recomendamos agregar directivas en tiempo de ejecución en los niveles de espacio de nombres y de tipo, en lugar de hacerlo en el nivel de miembro. Tenga en cuenta que puede haber una compensación entre la resistencia y los archivos con tiempos de compilación más prolongados.

Considere las siguientes cuestiones si se trata de una excepción de metadatos que faltan:

  • ¿Qué intentaba hacer la aplicación antes de la excepción?

    • Por ejemplo, ¿enlazaba datos, serializaba o deserializaba datos o usaba directamente la API de reflexión?
  • ¿Se trata de un caso aislado o cree que surgirá el mismo problema con otros tipos?

    • Por ejemplo, se produce una excepción MissingMetadataException al serializar un tipo en el modelo de objetos de la aplicación. Si sabe de otros tipos que se van a serializar, puede agregar también directivas en tiempo de ejecución para esos tipos (o para sus espacios de nombres contenedores, dependiendo de cómo esté organizado el código).
  • ¿Puede volver a escribir el código para que no use la reflexión?

    • Por ejemplo, ¿utiliza el código la palabra clave dynamic cuando se sabe qué tipo esperar?

    • ¿Llama el código a un método que depende de la reflexión cuando existe una alternativa mejor?

Nota

Para obtener información adicional sobre el control de problemas que se derivan de diferencias en la reflexión y la disponibilidad de metadatos en aplicaciones de escritorio y .NET Native, consulte API que dependen de la reflexión.

Si desea ver algunos ejemplos específicos de control de excepciones y otros problemas que se producen al probar la aplicación, consulte:

Vea también