Información general del sistema de tipos(C++/CX)

Con la arquitectura de Windows Runtime, se puede usar C++/WinRT, C++/CX, Visual Basic, Visual C# y JavaScript para escribir aplicaciones y componentes. Estas pueden acceder directamente a la API de Windows e interoperar con otras aplicaciones y componentes de Windows Runtime. Las aplicaciones de la Plataforma universal de Windows que están escritas en C++ se compilan en código nativo que se ejecuta directamente en la CPU. Las aplicaciones para UWP que están escritas en C# o en Visual Basic se compilan en lenguaje intermedio de Microsoft (MSIL) y se ejecutan en Common Language Runtime (CLR). Las aplicaciones UWP que están escritas en JavaScript se ejecutan en un entorno en tiempo de ejecución de JavaScript. Los propios componentes del sistema operativo de Windows Runtime se escriben en C++ y se ejecutan como código nativo. Todos estos componentes y aplicaciones para UWP se comunican directamente a través de la interfaz binaria de aplicación (ABI) de Windows Runtime.

Para habilitar la compatibilidad con el Windows Runtime en un lenguaje moderno de C++, Microsoft creó la extensión del lenguaje C++/CX. C++/CX proporciona tipos base integrados e implementaciones de tipos fundamentales de Windows Runtime. Estos tipos permiten a las aplicaciones y componentes de C++ comunicarse a través de la ABI con aplicaciones escritas en otros lenguajes. Las aplicaciones de C++/CX pueden consumir cualquier tipo de Windows Runtime. También pueden crear clases, estructuras, interfaces y otros tipos definidos por el usuario que pueden consumir otras aplicaciones y componentes de UWP. Una aplicación para UWP escrita en C++/CX también puede usar clases y estructuras de C++ normal mientras no tengan accesibilidad pública.

Si quiere ver una discusión en profundidad sobre la proyección del lenguaje C++/CX y cómo funciona tras los bastidores, consulte estas publicaciones de blogs:

Nota:

Aunque C++/CX sigue siendo compatible, se recomienda usar C++/WinRT para nuevas aplicaciones y componentes de Windows Runtime en su lugar. Está diseñado para proporcionarle acceso de primera a la API de Windows moderna. A pesar del nombre, C++/WinRT solo usa C++17 estándar sin extensiones. Usa una biblioteca de solo encabezado para implementar una proyección de lenguaje C++ para las API de Windows Runtime. C++/WinRT está disponible en Windows SDK a partir de la versión 1803 (10.0.17134.0).

Archivos de metadatos de Windows (.winmd)

Cuando se compila una aplicación para UWP escrita en C++, el compilador genera el ejecutable en código máquina nativo y también genera un archivo de metadatos de Windows (.winmd) independiente que contiene descripciones de los tipos de Windows Runtime públicos, que incluyen clases, estructuras, enumeraciones, interfaces, interfaces parametrizadas y delegados. El formato de los metadatos se parece al formato que se utiliza en los ensamblados de .NET Framework. En un componente de C++, el archivo .winmd solo contiene metadatos; el código ejecutable está en un archivo independiente. Los componentes de Windows Runtime incluidos en Windows usan esta disposición. Un nombre de archivo .winmd tiene que coincidir o ser un prefijo del espacio de nombres raíz en el código fuente. (Para los lenguajes de .NET Framework, el archivo de .winmdcontiene el código y los metadatos, como un ensamblado de .NET Framework).

Los metadatos del archivo de .winmd representan la superficie publicada de su código. Los tipos publicados son visibles para otras aplicaciones para UWP con independencia del lenguaje en que se escriban esas otras aplicaciones. Los metadatos o el código publicado, solo pueden contener tipos especificados por el sistema de tipos de Windows Runtime. No se pueden publicar construcciones de lenguaje específicas de C++, como clases normales, matrices, plantillas o contenedores de la biblioteca estándar (STL) de C++. Una aplicación cliente de JavaScript o C# no sabría qué hacer con ellas.

Que un tipo o un método estén visibles en los metadatos depende de los modificadores de accesibilidad que se les aplique. Para que esté visible, un tipo se debe declarar en un espacio de nombres y como public. Una clase no publicref class se permite como tipo del asistente interno en tu código; simplemente no está visible en los metadatos. Incluso en una clase public ref class, no todos los miembros están visibles necesariamente. En la tabla siguiente se muestra la relación entre los especificadores de acceso de C++ en una public ref class y la visibilidad de los metadatos de Windows Runtime:

Publicado en metadatos No publicado en metadatos
public private
protected internal
public protected private protected

Se puede usar el Explorador de objetos para ver el contenido de los archivos .winmd. Los componentes de Windows Runtime incluidos con Windows se encuentran en el archivo Windows.winmd. El archivo default.winmd contiene los tipos fundamentales que se usan en C++/CX y platform.winmd contiene tipos del espacio de nombres Platform. De forma predeterminada, estos tres archivos .winmd se incluyen en todos los proyectos de C++ para aplicaciones UWP.

Sugerencia

Los tipos del espacio de nombres Platform::Collections no aparecen en el archivo .winmd porque no son públicos. Son implementaciones específicas de C++ privadas de las interfaces que se definen en Windows::Foundation::Collections. Una aplicación de Windows Runtime escrita en JavaScript o C# no sabe qué es una clase Platform::Collections::Vector, pero puede usar un Windows::Foundation::Collections::IVector. Los tipos Platform::Collections se definen en collection.h.

Sistema de tipos de Windows Runtime en C++/CX

En las secciones siguientes se describen las características principales del sistema de tipos de Windows Runtime y cómo se admiten en C++/CX.

Espacios de nombres

Todos los tipos de Windows Runtime deben declararse dentro de un espacio de nombres; la propia API de Windows se organiza mediante el espacio de nombres. Un archivo .winmd debe tener el mismo nombre que el espacio de nombres de la raíz. Por ejemplo, se pueden crear instancias de una clase denominada A.B.C.MyClass solo si está definida en un archivo de metadatos denominado A.winmd, A.B.winmd o A.B.C.winmd. El nombre de la DLL no tiene que coincidir con el nombre del archivo .winmd.

La propia API de Windows se ha reinventado como una biblioteca de clases correctamente factorizada que se organiza mediante espacios de nombres. Todos los componentes de Windows Runtime se declaran en los espacios de nombres de Windows.*.

Para obtener más información, consulte Espacios de nombres y visibilidad de tipos.

Tipos fundamentales

El Windows Runtime define los siguientes tipos fundamentales: UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Char16, Boolean y String. C++/CX admite los tipos numéricos fundamentales en su espacio de nombres predeterminado como uint16, uint32, uint64int16int32int64, float32, float64 y char16. Boolean y String están definidos en el espacio de nombres Platform.

C++/CX también define uint8, equivalente a unsigned char, que no se admite en Windows Runtime y no se puede usar en las API públicas.

Un tipo fundamental puede convertirse en un tipo que admite un valor NULL incluyéndolo en una interfaz Platform::IBox. Para obtener más información, consulta Clases y structs de valor.

Para obtener más información sobre los tipos fundamentales, consulta Tipos fundamentales

Cadenas

Una cadena de Windows Runtime es una secuencia inmutable de caracteres UNICODE de 16 bits. Una cadena de Windows Runtime se proyecta como Platform::String^. Esta clase proporciona métodos para la construcción, manipulación y conversión de cadenas a un tipo wchar_ty desde dicho tipo.

Para obtener más información, consulta Cadenas.

Matrices

Windows Runtime admite matrices unidimensionales de cualquier tipo. No se admiten matrices de matrices. En C++/CX, las matrices de Windows Runtime se proyectan como la clasePlatform::Array.

Para obtener más información, vea Array y WriteOnlyArray.

ref class y tipos ref struct

Una clase de Windows Runtime se proyecta en C++/CX como un tipo ref class o ref struct, porque se copia por referencia. La administración de memoria para los objetos ref class y ref struct se controla de forma transparente mediante el recuento de referencias. Cuando la última referencia a un objeto sale del ámbito, el objeto se destruye. Un tipo ref class o ref struct puede:

  • Contener como miembros constructores, métodos, propiedades y eventos. Estos miembros pueden tener accesibilidad de public, private, protected o internal.

  • Puede contener definiciones anidadas privadas enum, struct o class.

  • Heredar directamente de una clase base e implementar cualquier número de interfaces. Todas los objetos ref class se pueden convertir implícitamente a la clasePlatform::Object y pueden invalidar sus métodos virtuales como por ejemplo, Object::ToString.

Una clase ref class que tenga un constructor público se debe declarar como sealed, para evitar la derivación adicional.

Para obtener más información, consulta Clases ref y structs ref

value class y tipos value struct

Una value class o value struct representa una estructura de datos básica y contiene solo campos, los cuales pueden ser tipos value class, value struct o Platform::String^. value struct y los objetos value class se copian por valor.

Una value struct se puede convertir en un valor que admite un valor NULL incluyéndolo en una interfaz IBox.

Para obtener más información, consulta Clases y structs de valor.

Clases parciales

La característica de clases parciales permite definir una clase en varios archivos. Permite a las herramientas de generación de código como el editor de XAML modificar un archivo sin tocar otro archivo que se esté editando.

Para obtener más información, consulta Clases parciales

Propiedades

Una propiedad es un miembro de datos público de cualquier tipo de Windows Runtime. Se declara y define mediante la palabra clave property. Una propiedad se implementa como par de métodos get/set. El código de cliente tiene acceso a una propiedad como si fuera un campo público. Una propiedad que no requiere código de tipo get o set personalizado se conoce como propiedad trivial y se puede declarar sin métodos de tipo get o set explícitos.

Para obtener más información, consulta Propiedades.

Colecciones de Windows Runtime en C++/CX

Windows Runtime define un conjunto de interfaces para los tipos de colección que cada lenguaje implementa de manera propia. C++/CX proporciona implementaciones en la clase Platform::Collections::Vector, clase Platform::Collections::Map y otros tipos de colección concretos relacionados, que son compatibles con sus homólogos de la biblioteca estándar de C++.

Para obtener más información, consulte Colecciones.

Tipos de plantilla ref class

los tipos de acceso private y internal de las ref class se pueden hacer plantillas y especializarse.

Para obtener más información, consulta Clases ref de plantilla.

Interfaces

Una interfaz de Windows Runtime define un conjunto de propiedades, métodos y eventos públicos que una ref class o un tipo ref struct deben implementar si heredan de la interfaz.

Para más información, vea Interfaces.

Enumeraciones

Un tipo enum class de Windows Runtime se parece a un ámbito enum en C++. El tipo subyacente es int32, a menos que se aplique el atributo [Flags]; en ese caso, el tipo subyacente es uint32.

Para obtener más información, consulta Enumeraciones.

Delegados

Un delegado en Windows Runtime es análogo a un objeto std::function en C++. Es un tipo especial de ref class que se usa para invocar funciones proporcionadas por el cliente que tienen firmas compatibles. Los delegados se usan con mucha frecuencia en Windows Runtime como el tipo de un evento.

Para obtener más información, vea Delegados (Guía de programación de C#).

Excepciones

En C++/CX se pueden capturar tipos d excepción personalizados, tipos std::exception y tipos Platform::Exception.

Para obtener más información, consulta Excepciones.

Eventos

Un evento es un miembro público en una clase ref class o ref struct cuyo tipo es un tipo delegado. Un evento solo puede ser invocado, es decir desencadenado, por la clase propietaria. Sin embargo, el código de cliente puede proporcionar sus propios controladores de eventos, que se invocan cuando la clase propietaria desencadena el evento.

Para más información, vea Eventos.

Conversión

C++/CX admite los operadores de conversión estándar de C++ static_cast, dynamic_cast y reinterpret_cast, y también el operador safe_cast que es específico para C++/CX.

Para obtener más información, consulta Conversión.

Boxing

Una variable en caja es un tipo de valor que está encapsulado en un tipo de referencia. Use las variables en caja en situaciones en las que se requiera una semántica de referencia.

Para obtener más información, consulta Boxing.

Atributos

Un atributo es un valor de metadatos que se puede aplicar a cualquier tipo o miembro de tipo de Windows Runtime. Los atributos se pueden inspeccionar en tiempo de ejecución. Windows Runtime define un conjunto de atributos comunes en el espacio de nombres Windows::Foundation::Metadata. Los atributos definidos por el usuario en interfaces públicas no se admiten en esta versión e Windows Runtime.

API en desuso

Se pueden marcar las API públicas como en desuso al usar el mismo atributo que el usado por los tipos del sistema de Windows Runtime.

Para obtener más información, consulte Tipos y miembros en desuso.

Consulte también

Referencia del lenguaje C++/CX