Compartilhar via


Símbolos de Metadados

Metadados se refere a informações declarativas, sobre abstrações, incluindo o tempo de execução tipos (classes, tipos de valor e interfaces), funções globais e variáveis globais. Os metadados são armazenados em tabelas — uma tabela para cada categoria de abstração e uma linha da tabela para cada declaração de uma abstração. Um token (um objeto do tipo mdToken) é usado para localizar o registro que contém os metadados para uma abstração. O mecanismo de metadados usa o token de índice em uma tabela de metadados específicos em um escopo de metadados de determinado.

Estrutura do Token de metadados

Um token de metadados é um valor de 4 bytes. O byte mais significativo (MSB) Especifica o tipo de token e, conseqüentemente, identifica a abstração e a sua tabela de metadados associados. Por exemplo, um valor de 1 no MSB significa que o token é um mdTypeRef token, que representa uma referência de tipo e seus metadados são armazenados na tabela de metadados TypeRef; um valor de 4 no MSB corresponde a um mdFieldDef token. O CorTokenType enumeração é usada para especificar os tipos de token.

Os três bytes inferiores, conhecido como identificador de registro (RID) contêm o índice da linha dentro da tabela de metadados ao qual se refere a MSB do token. Por exemplo, o token de metadados com o valor 0x02000007 refere-se a linha 7 na tabela TypeDef no escopo atual. Da mesma forma, token 0x0400001A refere-se a linha 26 (decimal) na tabela FieldDef no escopo atual. Linha zero de uma tabela de metadados nunca contém dados, portanto, um token de metadados cujo RID é zero é conhecido como um símbolo nil. Os metadados API define um host de tais tokens nil, um para cada tipo de token, como mdTypeRefNil, com o valor 0x01000000.

Observação

A explicação anterior de RIDs é conceitual; Na realidade, o layout físico dos metadados é muito mais complicado.Além disso, tokens de seqüência de caracteres (mdString) são ligeiramente diferentes — os inferiores 3 bytes não são identificadores de registros, mas representam um deslocamento para a seqüência do local de início no pool de cadeia de caracteres de metadados.

Usando os Tokens de metadados

Cada DefineXXX método nos metadados API retorna um token que pode ser passado para um GetXXX método para obter seus atributos associados.

Os tokens de metadados são definidos em um escopo. Por exemplo, um token de metadados com o valor n completamente identifica, em um determinado escopo, um registro que contém detalhes sobre uma definição de tipo. No entanto, em um escopo diferente, um token de metadados com o mesmo valor n pode especificar um registro completamente diferente.

Um token de metadados não é um identificador de objeto imutável de metadados. Quando dois escopos são mesclados, tokens do escopo importado são remapeados em tokens no escopo emitido. Quando um escopo de metadados é salvo, várias otimizações de formato podem resultar em remapeamento de token.

Tipos de token

A tabela a seguir lista os tipos de token de metadados, a abstração representando cada tipo de token e o nome da tabela de metadados que contém os metadados da abstração. Todos os tipos de token são variações do mdToken, que é o tipo de token básico.

Tipo de token

Tabela de metadados

Abstração

mdModule

Module

Módulo: Uma unidade de compilação, um executável ou alguns outros a unidade de desenvolvimento, a unidade de implantação ou a unidade de tempo de execução. É possível (embora não seja necessário) para declarar atributos no módulo como um todo, incluindo um nome, um GUID, atributos personalizados e assim por diante.

mdModuleRef

ModuleRef

Referência de módulo: Uma referência de tempo de compilação para um módulo, que registra a origem para que as importações de tipo e membro.

mdTypeDef

TypeDef

Declaração de tipo: Declaração de um tipo de referência de tempo de execução (classe ou interface) ou de um tipo de valor.

mdTypeRef

TypeRef

Tipo de referência: Referência a um tipo de referência de tempo de execução ou de um tipo de valor. De certa forma, a coleção de referências de tipo em um módulo é a coleção de dependências de importação de tempo de compilação.

mdMethodDef

MethodDef

Definição de método: Definição de um método como um membro de uma classe ou interface, ou como um método global do nível de módulo.

mdParamDef

ParamDef

Declaração de parâmetro: Definição de uma estrutura de dados opcionais que armazena metadados adicionais para o parâmetro. Não é necessário emitir uma estrutura de dados para cada parâmetro em um método. No entanto, quando há metadados adicionais para persistir no parâmetro, como informações de empacotamento ou mapeamento de tipo, uma estrutura de dados do parâmetro opcional pode ser criada.

mdFieldDef

FieldDef

Declaração de campo: Declaração de uma variável como um membro de dados de uma classe ou interface ou declaração de uma variável global, o nível de módulo.

mdProperty

Propriedade

Declaração de propriedade: Declaração de uma propriedade como um membro de uma classe ou interface.

mdEvent

Evento

Declaração de evento: Declaração de um evento nomeado como membro de uma classe ou interface.

mdMemberRef

MemberRef

Referência de membro: Referência a um campo ou método. Uma referência ao membro é gerada no metadados para cada invocação de método ou o acesso de campo é feito por qualquer implementação no módulo atual e um token é mantido no fluxo Microsoft intermediate language (MSIL). Não há nenhum suporte de tempo de execução para referências de propriedade ou evento.

mdIfaceImpl

IfaceImpl

Implementação de interface: Implementação de uma classe específica de uma interface específica. Essa abstração de metadados permite o armazenamento de informações é a interseção de que o que é específica para a classe nem a interface.

mdMethodImpl

MethodImpl

Implementação do método: Implementação de uma classe específica de um método herdado usando a herança da interface. Essa abstração de metadados permite que informações sejam mantidas isto é específico para a implementação, em vez de fazê-lo para o contrato. Informações de declaração de método não podem ser modificadas pela implementação da classe.

mdCustomAttribute

CustomAttribute

Atributo personalizado: Uma estrutura de dados arbitrários associada a qualquer objeto de metadados pode ser referenciado com um mdToken. (Uma exceção é que os atributos personalizados próprios não podem ter atributos personalizados).

mdPermission

Permissão

Conjunto de permissões: Um conjunto de permissões de segurança declarativa associado mdTypeDef, mdMethodDef, e mdAssembly. Para obter mais informações, consulte Adicionando suporte a segurança declarativa.

mdTypeSpec

TypeSpec

Construtor do tipo: Um método que obtém um token para um tipo (como, por exemplo, um tipo de valor convertidos) que pode ser usado como entrada para qualquer instrução MSIL que leva um tipo.

mdSignature

Assinatura

Assinatura autônoma: Uma assinatura de variável local no arquivo executável portátil (PE) ou uma assinatura do método que é passada para uma instrução MSIL.

mdString

String

Cadeia de caracteres do usuário: Uma seqüência de caracteres que é passada para uma instrução MSIL.

Observação

A lista anterior não inclui dois token tipos separados, um para uma referência de campo e outro para uma referência de método, como se poderia esperar.Referências de campo e método compartilham a mesma tabela e pode ser consultadas usando o tipo de token mdMemberRef.

Extensibilidade e abstrações

Os metadados de tempo de execução são extensível, o que é importante nas seguintes situações:

  • Para representar as restrições ou abstrações definidas por especificação de linguagem comum (CLS). O CLS é uma especificação de convenções que concordam de linguagens e ferramentas para suportar de maneira uniforme para melhor integração de linguagem. O CLS pode restringir a partes do modelo de sistema de tipo comum e o CLS pode introduzir abstrações que estão em camadas sobre o common type system. Metadados devem ser capazes de capturar esses tipos de abstrações em tempo de desenvolvimento usados pelas ferramentas, embora, por exemplo, as abstrações não são reconhecidas ou explicitamente suportadas pelo runtime.

  • Para representar as abstrações de específicos do idioma que não fazem parte do common type system e não são abstrações de CLS. Isso permite que linguagens como Visual C não exigem arquivos de cabeçalho separado ou IDL para usar tipos, métodos e membros de dados exportados por módulos compilados.

  • Para codificar os tipos de membro de assinatura e digite o modificadores que são usados na sobrecarga de idioma específico.

Extensibilidade de metadados tem os seguintes formulários:

  • Cada objeto de metadados pode oferecer suporte a atributos personalizados e os metadados APIs fornecem uma maneira de declarar, enumerar e recuperar atributos personalizados. Atributos personalizados podem ser identificados por uma referência de tipo (mdTypeDef e mdTypeRef). A estrutura do atributo personalizado é autodescritivo, o uso de membros de dados declarados no tipo, e o valor de codificação é navegável por qualquer ferramenta, incluindo os serviços de reflexão de tempo de execução.

  • Além de estender o common type system, é possível emitir modificadores personalizados em assinaturas de membros. O runtime honrará esses modificadores de sobrecarga e ocultando, bem como para vinculação de método, mas não irá impor qualquer semântica de linguagem específica.

Consulte também

Conceitos

Visão geral de metadados