Partilhar via


IMetaDataEmit::MergeEnd Method

Mescla no escopo atual todos os escopos de metadados especificados por uma ou mais chamadas anteriores para IMetaDataEmit::Merge.

Syntax

HRESULT MergeEnd ();

Parameters

Este método não usa parâmetros.

Remarks

Essa rotina aciona a mesclagem real de metadados, de todos os escopos de importação especificados por chamadas anteriores para IMetaDataEmit::Merge, no escopo de saída atual.

Aplicam-se as seguintes condições especiais à fusão:

  • Um identificador de versão do módulo (MVID) nunca é importado, porque é exclusivo para os metadados no escopo de importação.

  • Nenhuma propriedade existente em todo o módulo é substituída.

    Se as propriedades do módulo já estiverem definidas para o escopo atual, nenhuma propriedade do módulo será importada. No entanto, se as propriedades do módulo não tiverem sido definidas no escopo atual, elas serão importadas apenas uma vez, quando forem encontradas pela primeira vez. Se essas propriedades do módulo forem encontradas novamente, elas serão duplicadas. Se os valores de todas as propriedades do módulo (exceto MVID) forem comparados e nenhuma duplicata for encontrada, um erro será gerado.

  • Para definições de tipo (TypeDef), nenhuma duplicata é mesclada no escopo atual. TypeDefobjetos são verificados quanto a duplicatas em relação a cadanome + de objeto totalmente qualificado, númerode versão GUID + . Se houver uma correspondência em qualquer nome ou GUID, e qualquer um dos outros dois elementos for diferente, um erro será gerado. Caso contrário, se todos os três itens corresponderem, MergeEnd faz uma verificação rápida para garantir que as entradas são realmente duplicadas, se não, um erro é gerado. Esta verificação superficial procura:

    • As mesmas declarações de membro, ocorrendo na mesma ordem. Membros que são sinalizados como mdPrivateScope (consulte a enumeração CorMethodAttr ) não são incluídos nesta verificação, eles são mesclados especialmente.

    • O mesmo layout de classe.

    Isso significa que um TypeDef objeto deve ser sempre definido de forma completa e consistente em cada escopo de metadados em que é declarado, se suas implementações de membro (para uma classe) estão espalhadas por várias unidades de compilação, a definição completa é assumida como presente em todos os escopo e não incremental para cada escopo. Por exemplo, se os nomes dos parâmetros forem relevantes para o contrato, devem ser emitidos da mesma forma em todos os âmbitos; se não forem relevantes, não devem ser emitidos para metadados.

    A exceção é que um TypeDef objeto pode ter membros incrementais sinalizados como mdPrivateScope. Ao encontrá-los, MergeEnd adiciona-os incrementalmente ao escopo atual sem levar em conta duplicatas. Como o compilador entende o escopo privado, o compilador deve ser responsável por impor regras.

  • Os endereços virtuais relativos (RVAs) não são importados ou mesclados; espera-se que o compilador reemita essas informações.

  • Os atributos personalizados são mesclados somente quando o item ao qual eles estão anexados é mesclado. Por exemplo, atributos personalizados associados a uma classe são mesclados quando a classe é encontrada pela primeira vez. Se os atributos personalizados estiverem associados a um TypeDef ou MemberDef que seja específico para a unidade de compilação (como o carimbo de data/hora de uma compilação membro), eles não serão mesclados e caberá ao compilador remover ou atualizar esses metadados.

Requirements

Plataformas: Consulte Sistemas operacionais suportados pelo .NET.

Header: Cor.h

Library: CorGuids.lib

See also