Sistema de tipos (C++/CX)
Mediante la arquitectura de Windows Runtime, puede usar C++/CX, Visual Basic, Visual C# y JavaScript para escribir aplicaciones y componentes que acceden directamente a la API de Windows e interoperan con otras aplicaciones y componentes de Windows Runtime. Las aplicaciones Windows platform universales escritas en C++ se compilan en código nativo que se ejecuta directamente en la CPU. Las aplicaciones Windows Platform universales escritas en C# o Visual Basic compilan en el lenguaje intermedio de Microsoft (MSIL) y se ejecutan en Common Language Runtime (CLR). Las aplicaciones Windows plataforma universal escritas en JavaScript se ejecutan en un entorno en tiempo de ejecución. Los Windows del sistema operativo runtime se escriben en C++ y se ejecutan como código nativo. Todos estos componentes y las aplicaciones Windows Plataforma universal se comunican directamente a través de la interfaz binaria de aplicaciones (ABI) de Windows Runtime.
Para habilitar la compatibilidad con Windows Runtime en una expresión moderna de C++, Microsoft creó el C++/CX. C++/CX proporciona tipos base integrados e implementaciones de tipos fundamentales de Windows Runtime que permiten que las aplicaciones y componentes de C++ se comuniquen a través de la ABI con aplicaciones escritas en otros lenguajes. Puede consumir cualquier tipo Windows Runtime o crear clases, structs, interfaces y otros tipos definidos por el usuario que puedan consumir otras aplicaciones y componentes de la Plataforma universal de Windows. Una aplicación Windows Platform universal escrita en C++/CX también puede usar clases y structs de C++ normales, siempre y cuando 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:
C++/CX Part 0 of [n]: An Introduction (C++/CX Parte 0 de [n]: introducción)
C++/CX Part 2 of [n]: Types That Wear Hats (C++/CX Parte 2 de [n]: tipos que llevan sombreros)
C++/CX Part 3 of [n]: Under Construction (C++/CX Parte 3 de [n]: en construcción)
C++/CX Part 4 of [n]: Static Member Functions (C++/CX Parte 4 de [n]: funciones miembro estáticas)
Archivos de metadatos de Windows (.winmd)
Al compilar una aplicación de plataforma Windows universal escrita en C++, el compilador genera el ejecutable en código de máquina nativo y también genera un archivo de metadatos de Windows independiente (.winmd) que contiene descripciones de los tipos públicos de tiempo de ejecución de Windows, 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 reside en un archivo independiente. Este es el caso de los componentes Windows Runtime que se incluyen con Windows. El 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 .winmd contiene el código y los metadatos, como un ensamblado de .NET Framework).
Los metadatos del archivo de .winmd representan la superficie publicada de tu código. Los tipos publicados son visibles para otras plataformas universales Windows independientemente del lenguaje en el que estén escritas esas otras aplicaciones. Por lo tanto, los metadatos, o el código publicado, solo pueden contener tipos especificados por el sistema de tipos Windows runtime. Las construcciones de lenguaje específicas de C++, como clases, matrices, plantillas o contenedores STL normales, no se pueden publicar en los metadatos porque una aplicación cliente de JavaScript o de C# no sabría lo que debería 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 público. Una clase ref pública se permite como tipo del asistente interno en tu código; simplemente no está visible en los metadatos. Incluso en una clase ref pública, 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 clase ref pública y Windows visibilidad de metadatos en tiempo de ejecución:
| Publicado en metadatos | No publicado en metadatos |
|---|---|
| público | private |
| protected | internal |
| público protegido | privado protegido |
Puedes utilizar el Explorador de objetos para ver el contenido de los archivos .winmd. Los Windows runtime que se incluyen con Windows están en el archivo Windows.winmd. El archivo default.winmd contiene los tipos fundamentales que se usan en C++/CX y platform.winmd contiene tipos adicionales del espacio de nombres Platform. De forma predeterminada, estos tres archivos .winmd se incluyen en todos los proyectos de C++ para aplicaciones Windows plataforma universal.
Sugerencia
Los tipos de Platform::Collections Namespace 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 Windows Runtime escrita en JavaScript o C# no sabe qué es una clase Platform::Collections::Vector, pero puede consumir . Los tipos de Platform::Collections se definen en collection.h.
Windows sistema de tipos en tiempo de ejecución en C++/CX
En las secciones siguientes se describen las características principales del sistema de Windows runtime y cómo se admiten en C++/CX.
Espacios de nombres
Todos Windows runtime deben declararse dentro de un espacio de nombres; la API de Windows propiamente dicha se organiza por espacios 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 Windows runtime se declaran en los espacios de nombres Windows.*.
Para obtener más información, vea Espacios de nombres y Visibilidad de tipos.
Tipos fundamentales
El runtime Windows 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, uint64, int16, int32, int64, float32, float64 y char16. Boolean y String también se definen en el espacio de nombres Platform.
C++/CX también define uint8, equivalente a , que no se admite en Windows Runtime y no se puede unsigned char usar en las API públicas.
Un tipo fundamental puede convertirse en un tipo que acepte valores 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 Windows runtime es una secuencia inmutable de caracteres UNICODE de 16 bits. Una 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
El Windows runtime admite matrices unidimensionales de cualquier tipo. No se admiten matrices de matrices. En C++/CX, las Windows runtime se proyectan como la clase Platform::Array.
Para obtener más información, vea Array y WriteOnlyArray.
Clases ref y structs ref
Una Windows Runtime se proyecta en C++/CX como una clase ref o ref struct, porque se copian por referencia. La administración de memoria para clases ref y structs ref se controlan de forma transparente mediante el recuento de referencias. Cuando la última referencia a un objeto sale del ámbito, el objeto se destruye. Una clase ref y un struct ref pueden:
Contener como miembros constructores, métodos, propiedades y eventos. Estos miembros pueden tener accesibilidad pública, privada, protegida o interna.
Contener definiciones de clases, structs o enumeraciones de tipo anidado privado.
Heredar directamente de una clase base e implementar cualquier número de interfaces. Todas las clases ref se pueden convertir implícitamente a Platform::Object Class y pueden invalidar sus métodos virtuales como Object::ToString.
Una clase ref que tenga un constructor público se debe declarar como sellada, para evitar la derivación adicional.
Para obtener más información, vea Clases y structs ref.
Clases y structs de valor
Una clase de valor o un struct de valor representan una estructura de datos básicos y solo contienen campos, que pueden ser clases de valor, structs de valor o Platform::String^de tipo. Los structs de valor y las clases de valor se copian por valor.
Un struct de valor se puede convertir en un struct que acepte valores 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. Se utiliza principalmente para permitir a las herramientas de generación de código como el editor de XAML modificar un archivo sin tocar el archivo que estás editando.
Para obtener más información, consulta Clases parciales
Propiedades
Una propiedad es un miembro de datos público de cualquier tipo Windows Runtime y se implementa como un 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.
Windows runtime en C++/CX
El Windows runtime define un conjunto de interfaces para los tipos de colección que cada lenguaje implementa a su manera. C++/CX proporciona implementaciones en la clase Platform::Collections::Vector, Platform::Collections::Map yotros tipos de colección concretos relacionados, que son compatibles con sus homólogos de Standard Template Library (STL).
Para obtener más información, vea Colecciones.
Clases ref de plantilla
Las clases privadas y las clases ref internas se pueden convertir en plantillas y personalizarse para usos concretos.
Para obtener más información, consulta Clases ref de plantilla.
Interfaces
Una Windows Runtime define un conjunto de propiedades públicas, métodos y eventos que una clase ref o ref struct debe implementar si hereda de la interfaz.
Para más información, vea Interfaces.
Enumeraciones
Una clase enum de Windows Runtime es similar a una enumeración con ámbito 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 de Windows Runtime es análogo a un objeto std::function en C++. Es un tipo especial de clase ref que se utiliza para invocar funciones proporcionadas por el cliente que tienen firmas compatibles. Los delegados se usan con más 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, puedes detectar tipos de 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 o un struct ref 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 propias funciones, que se denominan controladores de eventos y 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_casty reinterpret_cast, y también el operador safe_cast que es específico de C++/CX.
Para obtener más información, consulta Conversión.
Boxing
Una variable a la que se le ha aplicado una conversión boxing es un tipo de valor incluido en un tipo de referencia usado en situaciones donde se es necesaria 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 miembro de tipo Windows Runtime y se puede inspeccionar en tiempo de ejecución. El Windows runtime define un conjunto de atributos comunes en el espacio de Windows::Foundation::Metadata nombres . Los atributos definidos por el usuario en las interfaces públicas no son compatibles con Windows Runtime en esta versión.
Marcar la API como en desuso
Describe cómo marcar las API públicas como en desuso mediante el mismo atributo que usan los tipos de sistema Windows runtime.
Para obtener más información, vea Deprecating types and members.