Partilhar via


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

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

Para habilitar o suporte para o Tempo de Execução do Windows em uma linguagem C++ moderna, a Microsoft criou a extensão de linguagem C++/CX. O C++/CX fornece tipos básicos internos e implementações de tipos fundamentais do Tempo de Execução do Windows. Esses tipos permitem que aplicativos e componentes C++ se comuniquem através da ABI com aplicativos escritos em outros idiomas. Os aplicativos C++/CX podem consumir qualquer tipo de Tempo de Execução do Windows. 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 escrito em C++/CX também pode usar classes e estruturas C++ regulares, desde que não tenham acessibilidade pública.

Para uma discussão aprofundada sobre a projeção da linguagem C++/CX e como ela funciona sob as cobertas, consulte estas postagens no blog:

Observação

Embora o C++/CX ainda seja suportado, recomendamos que você use C++/WinRT para novos aplicativos e componentes do Tempo de Execução do Windows. Ele foi projetado para fornecer acesso de primeira classe à API moderna do Windows. Apesar do nome, C++/WinRT usa apenas C++17 padrão sem extensões. Ele usa uma biblioteca somente de cabeçalho para implementar uma projeção de linguagem C++ para APIs do Tempo de Execução do Windows. 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 em código de máquina nativo e também gera um arquivo de metadados (.winmd) do Windows separado que contém descrições dos tipos públicos do Tempo de Execução do Windows, que incluem classes, structs, enumerações, interfaces, interfaces parametrizadas e delegados. O formato dos metadados é semelhante ao formato usado em assemblies do .NET Framework. Em um componente C++, o .winmd arquivo contém apenas metadados, o código executável está em um arquivo separado. Os componentes do Tempo de Execução do Windows incluídos no Windows usam essa disposição. Um .winmd nome de arquivo deve corresponder ou ser um prefixo do namespace raiz no código-fonte. (Para linguagens do .NET Framework, o .winmd arquivo contém o código e os metadados, assim como um assembly do .NET Framework.)

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

Se um tipo ou método é visível nos metadados depende de quais modificadores de acessibilidade são aplicados a ele. Para ser visível, um tipo deve ser declarado em um namespace e deve ser declarado como public. Um não-publicref class é permitido como um tipo auxiliar interno em seu código, ele simplesmente não é visível nos metadados. Mesmo em um public ref class, nem todos os membros são necessariamente visíveis. A tabela a seguir lista a relação entre os especificadores de acesso C++ em um public ref class, e a visibilidade de metadados do Tempo de Execução do Windows:

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

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

Sugestão

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

Sistema do tipo Tempo de Execução do Windows em C++/CX

As seções a seguir descrevem os principais recursos do sistema do tipo Tempo de Execução do Windows e como eles são suportados em C++/CX.

Namespaces

Todos os tipos do Tempo de Execução do Windows devem ser declarados em um namespace; a própria API do Windows é organizada por namespace. Um .winmd arquivo deve ter o mesmo nome que o namespace raiz. Por exemplo, uma classe nomeada A.B.C.MyClass só pode ser instanciada se estiver definida em um arquivo de metadados chamado A.winmd, A.B.winmdou A.B.C.winmd. O nome da DLL não é necessário para corresponder ao nome do .winmd arquivo.

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

Para obter mais informações, consulte Namespaces e visibilidade de tipo.

Tipos fundamentais

O Tempo de Execução do Windows define os seguintes tipos fundamentais: UInt8, Int16, UInt16, Int32, UInt32, UInt64Int64, Single, DoubleChar16Booleane .String C++/CX suporta os tipos numéricos fundamentais em seu namespace padrão como , , , , int16, int32int64, float32, float64e char16. uint64uint32uint16 Boolean e String também são definidos no Platform namespace.

C++/CX também define uint8, equivalente a unsigned char, que não é suportado no Tempo de Execução do Windows e não pode ser usado em APIs públicas.

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

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

Cordas

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

Para obter mais informações, consulte Strings.

Matrizes

O Tempo de Execução do Windows oferece suporte a matrizes unidimensionais de qualquer tipo. Não há suporte para matrizes de matrizes. Em C++/CX, as matrizes do Tempo de Execução do Windows são projetadas como a Platform::Array classe.

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

ref class e ref struct tipos

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

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

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

  • Pode herdar diretamente de uma classe base e pode implementar qualquer número de interfaces. Todos os ref class objetos são implicitamente conversíveis para a Platform::Object classe e podem substituir seus métodos virtuais — por exemplo, Object::ToString.

A ref class que tem um construtor público deve ser declarado como sealed, para evitar derivação adicional.

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

value class e value struct tipos

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

A value struct pode ser anulável envolvendo-o em uma IBox interface.

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

Aulas 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 Tempo de Execução do Windows. É declarado e definido usando a property palavra-chave. Uma propriedade é implementada como um par de get/set métodos. O código do cliente acessa uma propriedade como se fosse um campo público. Uma propriedade que não requer nenhum costume get ou set código é conhecida como uma propriedade trivial e pode ser declarada sem métodos ou set explícitosget.

Para obter mais informações, consulte Propriedades.

Coleções do Tempo de Execução do Windows em C++/CX

O Tempo de Execução do Windows define um conjunto de interfaces para tipos de coleção que cada linguagem implementa de sua própria maneira. C++/CX fornece implementações na Platform::Collections::Vector classe, Platform::Collections::Map classe e outros tipos de coleção concretos relacionados, que são compatíveis com suas contrapartes C++ Standard Library.

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

Tipos de modelo ref class

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

Para obter mais informações, consulte Classes ref de modelo.

Interfaces

Uma interface do Tempo de Execução do Windows define um conjunto de propriedades, métodos e eventos públicos que um ref class ou ref struct tipo deve implementar se herdar da interface.

Para obter mais informações, consulte Interfaces.

Enums

Um enum class tipo no Tempo de Execução do Windows se assemelha a um escopo em enum C++. O tipo subjacente é int32, a menos que o atributo [Flags] seja aplicado — nesse caso, o tipo subjacente é uint32.

Para obter mais informações, consulte Enums.

Delegados

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

Para obter mais informações, consulte Delegados.

Exceções

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

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

Eventos

Um evento é um membro público em um ref class ou ref struct cujo tipo é um tipo delegado. Um evento só pode ser invocado, ou seja, disparado, pela classe proprietária. No entanto, o código do cliente pode fornecer suas próprias funções de manipulador de eventos, que são invocadas quando a classe proprietária dispara o evento.

Para obter mais informações, consulte Eventos.

Casting

C++/CX suporta os operadores static_castde transmissão C++ padrão , dynamic_caste , e reinterpret_casttambém o safe_cast operador que é específico para C++/CX.

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

Boxe

Uma variável in a box é um tipo de valor 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 Boxe.

Atributos

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

Descontinuação da API

Você pode marcar APIs públicas como preteridas usando o mesmo atributo usado pelos tipos de sistema do Tempo de Execução do Windows.

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

Ver também

Referência da linguagem C++/CX