Usando a API de metadados e símbolos
Os metadados APIs podem ser chamadas do C++. A maneira como os metadados APIs são usadas depende em parte no tipo de cliente usá-los. A maioria dos clientes de API de metadados se encaixam em duas categorias:
Compiladores, como o compilador do Visual C++ 2005, que compilar arquivos .obj provisórias e, em seguida, use uma fase de vinculador separado mesclagem as unidades de compilação individual em um arquivo executável portátil (PE) de destino único.
Ferramentas de (RAD) método RAD que gerenciam todos os código e estruturas de dados no ambiente de ferramenta até criar time, quando elas criam e emitem um arquivo PE em uma única etapa.
Outros clientes podem usar APIs de metadados de forma que está entre esses dois estilos. Algumas ferramentas podem permitem que o mecanismo de metadados efetuar otimizações, mas não podem estar interessadas nas informações de remapeamento de token. Como alternativa, eles podem querer remapeamento informações apenas para alguns tipos de token e outros não. Na verdade, um compilador não pode executar otimizações mesmo quando emitir um arquivo obj.
O estilo ' compilar e vincular
No estilo de link e de compilar de interação, um front-participante do compilador usa o IMetaDataDispenserEx API para estabelecer um escopo de metadados na memória e, em seguida, usa o IMetaDataEmit API para declarar tipos e membros, trabalhando com as abstrações de metadados descritas em Visão geral de tokens de metadados. No entanto, o front-participante não será capaz de fornecer informações de implementação do método (por exemplo, se a implementação é gerenciada ou não gerenciada, MSIL ou código nativo) ou virtual relativo (RVA) informações, de endereço porque essas informações não podem ser determinadas no momento da compilar. Em vez disso, o back-participante ou vinculador, será necessário fornecer essas informações posteriormente, sistema autônomo o código é compilado e emitido em arquivo PE.
Uma complicação aqui é que a ferramenta de back-participante precisa ser capaz de obter informações sobre o destino de salvar o dimensionar dos metadados binário para deixar espaço para ele no arquivo PE. No entanto, a ferramenta não está pronta para salvar os metadados binário para o arquivo até que o método RVAs e membro de dados estático de nível de módulo RVAs são conhecidos e emitidos em metadados. Para calcular corretamente o dimensionar de salvar de destino, o mecanismo de metadados deve executar primeiro qualquer otimizações antes, pois essas otimizações, teoricamente, tornar o destino binário menores. Otimizações podem incluir classificação estruturas de dados para pesquisa mais rápida ou otimização ausente (associação inicial) mdTypeRef e mdMemberRef tokens quando a referência é um tipo ou membro declarado no escopo corrente. Esses tipos de otimizações podem resultar em tokens de metadados que a ferramenta deve ser capaz de reutilizar o remapeamento para emitir a implementação e informações RVA. sistema autônomo resultado, a ferramenta e o mecanismo de metadados devem trabalhar juntos para controlar sistema autônomo remapeamentos token.
Portanto, é a sequência de chamadas para metadados persistentes durante a compilação sistema autônomo segue:
IMetaDataEmit::SetHandler, para fornecer um IUnknown interface que o mecanismo de metadados pode ser usada para consulta IID_IMapToken, usado para notificar o cliente de token remapeados. SetHandler pode ser chamado a qualquer momento após a criação de escopo de metadados, mas certamente, antes que uma telefonar para IMetaDataEmit::GetSaveSize.
IMetaDataEmit::GetSaveSize, para obter o salvar dimensionar dos metadados binário. GetSaveSize usa o IMapToken interface fornecida no IMetaDataEmit::SetHandler, para notificar o cliente de qualquer token remapeados. If SetHandler não foi usado para fornecer um IMapToken interface, otimizações não são executadas. Isso permite que um compilador que está emitindo um arquivo .obj provisório para ignorar otimizações desnecessárias que possam ser refeita após a fase de link e mesclagem.
IMetaDataEmit::salvar, para manter sistema autônomo metadados binário, depois de IMetaDataEmit::SetRVA e outros IMetaDataEmit métodos são usados conforme necessário para emitir metadados implementação final.
O próximo nível de complicação é fornecido na fase de vinculador, quando várias unidades de compilação são mescladas em um arquivo PE integrado. Nesse caso, não apenas fazer sistema autônomo escopos de metadados precisam ser mescladas, mas sistema autônomo RVAs serão alterado novamente sistema autônomo o PE novo arquivo é emitido. Na fase de mesclagem, a IMetaDataEmit::Merge método, trabalhando com uma importação simples e um escopo emit único com cada telefonar, remapeia os símbolos de metadados do escopo de importação para o escopo emit. Além disso, o processo de mesclagem pode encontrar erros de continuidade que deve ser capaz de enviar ao cliente. Após concluir a mesclagem, emitir o arquivo PE final envolve uma telefonar para IMetaDataEmit::GetSaveSize e outra rodada de remapeamento de token.
A sequência de chamadas para emitir e metadados pelo vinculador de persistência é o seguinte:
IMetaDataEmit::SetHandler, para fornecer um IUnknown interface que o mecanismo de metadados pode usar para consultar IID_IMapToken não apenas sistema autônomo antes, mas também para IID_IMetaDataError. A última interface é usada para notificar o cliente de todos os erros continuidade que surgem da mesclagem.
IMetaDataEmit::Merge, mesclagem um escopo de metadados especificado no escopo corrente emit. Merge usa o IMapToken interface para notificar o cliente de token remapeamentos e ele usa IMetaDataError para notificar o cliente de continuidade de erros.
IMetaDataEmit::GetSaveSize, para obter o destino Salvar dimensionar do binário metadados. GetSaveSize usa o IMapToken interface fornecida no IMetaDataEmit::SetHandler para notificar o cliente de qualquer token remapeados. Uma ferramenta deve ser preparada para manipular os remapeamentos token em Merge e, em seguida, novamente no GetSaveSize Depois de executar otimizações de formato. A última notificação para obter um token representa o mapeamento final a ferramenta deve depender.
IMetaDataEmit::Save, para manter sistema autônomo metadados binário, após IMetaDataEmit::SetRVA e outros IMetaDataEmit métodos são usados conforme necessário para emitir metadados implementação final.
O estilo da ferramenta RAD
sistema autônomo no estilo de link e de compilar de interação, uma ferramenta RAD usa o IMetaDataDispenserEx interface para estabelecer um escopo de metadados na memória e, em seguida, usa o IMetaDataEmit interface para declarar tipos e membros, trabalhando com sistema autônomo abstrações de metadados descritas em Visão geral de tokens de metadados.
Em comparação com o estilo de link e de compilar, a ferramenta RAD geralmente emitirá o arquivo PE em uma única etapa. Ele provavelmente irá emitir informações de declaração e implementação em uma única passagem e ele provavelmente nunca precisará chamar IMetaDataEmit::Merge. Portanto, o único motivo que RAD a ferramenta pode ser necessário lidar com a complexidade do token remapeamentos é usufruir as otimizações antes que atualmente são executadas por IMetaDataEmit::GetSaveSize.
Em geral, uma ferramenta que pode emitir metadados totalmente otimizado não é necessário o mecanismo de metadados para emitir um arquivo otimizado razoavelmente. No entanto, futuras implementações do formato de arquivo e o mecanismo de metadados podem tornar algumas estratégias de otimização obsoleto, para que haja um conjunto claro de regras para como emitir metadados otimizado.
Depois de emitir sistema autônomo declarações de metadados e informações de implementação, a sequência de chamadas é o seguinte:
IMetaDataEmit::SetRVA e outros IMetaDataEmit métodos, conforme necessário, para emitir metadados implementação final.
IMetaDataEmit::Save, para manter os metadados do binário.