Visão geral do sistema de tipos (C++/CX)

Usando a arquitetura Windows Runtime, você pode usar C++/WinRT, C++/CX, Visual Basic, Visual C#e JavaScript para gravar aplicativos e componentes. Eles podem acessar diretamente a API do Windows e interoperar com outros Windows Runtime aplicativos e componentes. Os aplicativos da Plataforma Universal do Windows (UWP) escritos em C++ são compilados para código nativo que é executado diretamente na CPU. Os aplicativos UWP escritos em C# ou Visual Basic são compilados para MSIL (Microsoft intermediate language) e executados em CLR (common language runtime). Os aplicativos UWP escritos em JavaScript são executados em um ambiente de runtime do JavaScript. Os componentes do sistema operacional do Windows Runtime são escritos em C++ e executados como código nativo. Todos esses componentes e aplicativos do UWP se comunicam diretamente por meio da ABI (interface binária de aplicativo) do Windows Runtime.

Para habilitar o suporte para o Windows Runtime em um idioma C++ moderno, a Microsoft criou a extensão de linguagem C++/CX. O C++/CX fornece tipos base internos e implementações de tipos de Windows Runtime fundamentais. Esses tipos permitem que aplicativos e componentes C++ se comuniquem na ABI com aplicativos escritos em outras linguagens. Os aplicativos C++/CX podem consumir qualquer tipo de Windows Runtime. Eles também podem criar classes, structs, interfaces e outros tipos definidos pelo usuário que outros aplicativos e componentes UWP podem consumir. Um aplicativo UWP do C++/CX escrito em também pode usar classes e estruturas C++ regulares, desde que elas não tenham acessibilidade pública.

Para uma discussão mais profunda da projeção de idioma C++/CX e como ela funciona sob as coberturas, veja estas postagens do blog:

Observação

Embora ainda haja suporte para C++/CX, recomendamos que você use C++/WinRT para novos aplicativos e componentes Windows Runtime. Ela foi concebida para oferecer a você um acesso de primeira classe à moderna API do Windows. Apesar do nome, C++/WinRT usa apenas c++17 padrão sem extensões. Ela usa uma biblioteca somente de cabeçalho para implementar uma projeção de linguagem C++ para APIs do Windows Runtime. C++/WinRT está disponível no SDK do Windows a partir da versão 1803 (10.0.17134.0) em diante.

Arquivos de metadados do Windows (.winmd)

Quando você compila um aplicativo UWP escrito em C++, o compilador gera o executável no código de máquina nativo e também gera um arquivo de metadados do Windows (.winmd) separado que contém descrições de tipos do Windows Runtime públicos, que incluem classes, estruturas, enumerações, interfaces, interfaces parametrizadas e delegados. O formato de metadados lembra o formato usado nos assemblies do .NET Framework. Em um componente do C++, o arquivo .winmd contém apenas metadados; o código executável está em um arquivo separado. Os componentes do Windows Runtime incluídos no Windows usam essa disposição. O nome do arquivo .winmd deve coincidir ou ser um prefixo do namespace raiz no código-fonte. (Para as linguagens .NET Framework, o arquivo .winmd contém o código e os metadados, assim como um assembly do .NET Framework.)

Os metadados no arquivo .winmd representam a superfície publicada do seu código. Os tipos publicados são visíveis para outros aplicativos UWP independentemente da linguagem em que os outros aplicativos forem escritos. Portanto, os metadados ou seu código publicado podem conter apenas tipos especificados pelo sistema de tipo Windows Runtime. Não é possível publicar construções de linguagem específicas do C++, como classes regulares, matrizes, modelos ou contêineres STL (Biblioteca Padrão) C++. Um aplicativo cliente JavaScript ou C# não saberia o que fazer com eles.

Se um tipo ou um método estará visível nos metadados dependerá de quais modificadores de acessibilidade foram aplicados a ele. Para ser visível, um tipo deve ser declarado em um namespace e deve ser declarado como public. Um não-public ref class é permitido como um tipo auxiliar interno em seu código; simplesmente não é visível nos metadados. Até mesmo em uma public ref class, nem todos os membros estão necessariamente visíveis. A tabela a seguir lista a relação entre especificadores de acesso C++ em uma public ref class e a visibilidade dos metadados do Windows Runtime:

Publicado nos metadados Não publicado nos metadados
public private
protected internal
public protected private protected

Use o Pesquisador de objetos para exibir o conteúdo de arquivos .winmd. Os componentes Windows Runtime incluídos no Windows são encontrados no arquivo Windows.winmd. O arquivo default.winmd contém os tipos fundamentais que são usados no C++/CX e platform.winmd contém tipos do namespace Platform. Por padrão, esses três arquivos .winmd são incluídos em todos os projetos C++ para aplicativos UWP.

Dica

Os tipos no Platform::Collections namespace não aparecem no arquivo .winmd porque não são públicos. Eles são implementações particulares específicas do C++ das interfaces definidas em Windows::Foundation::Collections. Um aplicativo do Windows Runtime escrito em JavaScript ou C# não sabe o que é uma Platform::Collections::Vector classe, mas pode consumir um Windows::Foundation::Collections::IVector. Os tipos Platform::Collections são definidos em collection.h.

Sistema de tipo Windows Runtime no C++/CX

As seções a seguir descrevem as funcionalidades principais do sistema de tipo do Windows Runtime e como há suporte para eles no C++/CX.

Namespaces

Todos os tipos do Windows Runtime devem ser declarados em um namespace; a própria API do Windows é organizada por namespaces. Um arquivo .winmd deve ter o mesmo nome do namespace raiz. Por exemplo, uma classe denominada A.B.C.MyClass poderá ser instanciada somente se for definida em um arquivo de metadados denominado A.winmd, A.B.winmd ou A.B.C.winmd. O nome da DLL não precisa coincidir com o nome do arquivo .winmd.

A própria API do Windows foi reinventada como uma biblioteca de classes bem fatorada organizada por namespaces. Todos os componentes do Windows Runtime são declarados nos namespaces Windows.*.

Para obter mais informações, confira Namespaces e visibilidade do tipo.

Tipos fundamentais

O Windows Runtime define os seguintes tipos fundamentais: UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Char16, Boolean e String. O C++/CX dá suporte aos tipos numéricos fundamentais em seu namespace padrão comouint16, uint32, uint64, int16, int32, int64, float32, float64 e char16. Boolean e String são definidos no namespace Platform.

C++/CX também define uint8, equivalente a unsigned char, que não tem suporte no Windows Runtime e não pode ser usado em APIs públicas.

Um tipo fundamental pode ser transformado em anulável convertendo-o em uma interface Platform::IBox. Para obter mais informações, consulte Classes e estruturas de valor.

Para obter mais informações sobre tipos fundamentais, consulte Tipos fundamentais

Cadeias de caracteres

Uma cadeia de caracteres do Windows Runtime é uma sequência imutável de caracteres UNICODE de 16 bits. Uma cadeia de caracteres Windows Runtime é projetada como Platform::String^. Essa classe fornece métodos para construção, manipulação e conversão de cadeia de caracteres de e em wchar_t.

Para obter mais informações, consulte Cadeias de caracteres.

matrizes

O Windows Runtime dá suporte a matrizes unidimensionais de qualquer tipo. Não há suporte para matrizes de matrizes. No C++/CX, Windows Runtime matrizes são projetadas como a Platform::Array classe.

Para obter mais informações, consulte Array e WriteOnlyArray.

Tipos ref class e ref struct

Uma classe Windows Runtime é projetada em C++/CX como um tipo ref class ou ref struct, porque é copiada por referência. O gerenciamento de memória para os objetos ref classe ref struct é tratado de forma transparente por meio da contagem de referências. Quando a última referência a um objeto fica fora do escopo, o objeto é destruído. Um tipo ref class ou ref struct pode:

  • Conter como membros construtores, métodos, propriedades e eventos. Esses membros podem ter acessibilidade public, private, protectedou internal.

  • Pode conter definições aninhadas privadas enum, struct ou class.

  • Pode herdar diretamente de uma classe base e pode implementar qualquer número de interfaces. Todos os objetos ref class podem ser convertidos implicitamente na classe Platform::Object e podem substituir os métodos virtuais por, por exemplo, Object::ToString.

Um ref class que tem um construtor público também precisa ser declarado como sealed para evitar mais derivação.

Para obter mais informações, consulte Classes e estruturas ref

Tipos value class e value struct

Um value class ou value struct representa uma estrutura de dados básica e contém apenas campos, que podem ser do tipo value class, value struct ou Platform::String^. value struct e value class objetos são copiados por valor.

Um value structpode ser transformado em anulável convertendo em uma interface IBox.

Para obter mais informações, consulte Classes e estruturas de valor.

Classes parciais

O recurso de classe parcial permite que uma classe seja definida em vários arquivos. Ele permite que ferramentas de geração de código, como o editor XAML, modifiquem um arquivo sem tocar em outro arquivo editado.

Para obter mais informações, consulte Classes parciais

Propriedades

Uma propriedade é um membro de dados públicos de qualquer tipo de Windows Runtime. Ela é declarada com o uso da palavra-chave property. Uma propriedade é implementada como um par de métodos get/set. O código de cliente acessa uma propriedade como se fosse um campo público. Uma propriedade que não requer código get ou set personalizado é conhecida como uma propriedade trivial e pode ser declarada sem métodos get ou set explícitos.

Para obter mais informações, consulte Propriedades.

Coleções do Windows Runtime em C++/CX

O Windows Runtime define um conjunto de interfaces para tipos de coleção que cada linguagem implementa da sua própria maneira. C++/CX fornece implementações na classe Platform::Collections::Vector, , Platform::Collections::Map, e outros tipos de coleção concreta relacionadas, que são compatíveis com suas contrapartes da Biblioteca Padrão C++.

Para obter mais informações, confira Coleções.

Tipos de modelo ref class

private e internal tipos de acesso ref class podem ser modelos e especializados.

Para obter mais informações, consulte Classes de referência de modelo.

Interfaces

Uma interface do Windows Runtime define um conjunto de propriedades públicas, métodos e eventos que um tipo de ref class ou ref structdeverá implementar se herdar da interface.

Para obter mais informações, consulte Interfaces.

Enumerações

Um tipo enum class no Windows Runtime se assemelha a um escopo enum em C++. O tipo subjacente é int32, a menos que o atributo [Flags] seja aplicado; nesse caso, o tipo subjacente será uint32.

Para obter mais informações, consulte Enums.

Representantes

Um delegado no Windows Runtime é análogo a um objeto std::function no C++. É um tipo especial de ref class usado para invocar funções fornecidas pelo cliente que têm assinaturas compatíveis. Os delegados são usados mais comumente no Windows Runtime como o tipo de um evento.

Para obter mais informações, consulte Delegados.

Exceções

Em C++/CX, você pode capturar tipos de exceções padrão, tipos std::exception e tipos Platform::Exception.

Para obter mais informações, consulte Exceções.

Eventos

Um evento é um membro público em um tipo ref class ou ref structcujo tipo é delegado. Um evento somente pode ser invocado, ou seja, disparado, pela classe que o possui. No entanto, o código de cliente pode fornecer suas próprias funções, que são conhecidas como manipuladores de eventos e são invocadas quando a classe possuidora dispara o evento.

Para obter mais informações, consulte Eventos.

Transmissão

C++/CX oferece suporte aos operadores de conversão C++ padrão static_cast, dynamic_cast, reinterpret_cast e ao operador específico para C++/CX safe_cast.

Para obter mais informações, consulte Conversão.

Conversão boxing

Uma variável em caixa é um tipo de valor que é encapsulado em um tipo de referência. Use variáveis em caixa em situações em que a semântica de referência é necessária.

Para obter mais informações, consulte Boxing.

Atributos

Um atributo é um valor de metadados que pode ser aplicado a qualquer tipo ou membro de tipo do Windows Runtime. Os atributos podem ser inspecionados em tempo de execução. O Windows Runtime define um conjunto de atributos comuns no namespace Windows::Foundation::Metadata. Os atributos definidos pelo usuário nas interfaces públicas não têm suporte do Windows Runtime nessa versão.

Suspensão da API

Você pode marcar APIs públicas como preteridas usando o mesmo atributo usado pelos tipos de sistemas do Windows Runtime.

Para obter mais informações, consulte Os tipos e membros preteridos.

Confira também

Referência da linguagem C++/CX