다음을 통해 공유


IMetaDataEmit::MergeEnd 메서드

IMetaDataEmit::Merge에 대한 하나 이상의 이전 호출로 지정된 모든 메타데이터 범위를 현재 범위에 병합합니다.

구문

HRESULT MergeEnd ();

매개 변수

이 메서드는 매개 변수를 사용하지 않습니다.

설명

이 루틴은 IMetaDataEmit::Merge에 대한 이전 호출에 의해 지정된 모든 가져오기 범위의 메타데이터를 현재 출력 범위로 실제 병합하도록 트리거합니다.

병합에는 다음과 같은 특수 조건이 적용됩니다.

  • MVID(모듈 버전 식별자)는 가져오기 범위의 메타데이터에 고유하기 때문에 가져오지 않습니다.

  • 기존 모듈 전체 속성을 덮어쓰지 않습니다.

    현재 범위에 대해 모듈 속성이 이미 설정된 경우 모듈 속성을 가져오지 않습니다. 그러나 모듈 속성이 현재 범위에서 설정되지 않은 경우 처음 발견될 때 한 번만 가져옵니다. 이러한 모듈 속성이 다시 발생하면 중복됩니다. 모든 모듈 속성(MVID 제외)의 값을 비교하고 중복 항목이 없으면 오류가 발생합니다.

  • 형식 정의(TypeDef)의 경우 중복 항목이 현재 범위에 병합되지 않습니다. TypeDef 개체는 각 정규화된 개체 이름 + GUID + 버전 번호에 대해 중복이 있는지 확인합니다. 이름 또는 GUID에 일치하는 항목이 있고 다른 두 요소가 다른 경우 오류가 발생합니다. 그렇지 않고 세 항목이 모두 일치하는 경우 MergeEnd는 항목이 실제로 중복되었는지 확인하기 위해 검사를 수행합니다. 그렇지 않으면 오류가 발생합니다. 이 커서 검사는 다음을 찾습니다.

    • 동일한 순서로 발생하는 동일한 멤버 선언입니다. mdPrivateScope(CorMethodAttr 열거 참조)로 플래그가 지정된 멤버는 이 검사에 포함되지 않습니다. 그들은 특별히 병합됩니다.

    • 동일한 클래스 레이아웃입니다.

    이는 TypeDef 개체가 선언된 모든 메타데이터 범위에서 항상 완전하고 일관되게 정의되어야 함을 의미합니다. 해당 멤버 구현(클래스용)이 여러 컴파일 단위에 분산되어 있는 경우 전체 정의는 각 범위에 대해 증분적이지 않고 모든 범위에 존재하는 것으로 가정됩니다. 예를 들어 매개 변수 이름이 계약과 관련된 경우 모든 범위에 동일한 방식으로 내보내야 합니다. 관련이 없는 경우 메타데이터로 내보내지 않아야 합니다.

    예외는 TypeDef 개체에 mdPrivateScope 플래그가 지정된 증분 멤버가 있을 수 있다는 것입니다. 이러한 문제가 발생하면 MergeEnd는 중복을 고려하지 않고 현재 범위에 점진적으로 추가합니다. 컴파일러는 개인 범위를 이해하기 때문에 컴파일러는 규칙을 적용해야 합니다.

  • RA(상대 가상 주소)는 가져오거나 병합하지 않습니다. 컴파일러는 이 정보를 다시 내보내야 합니다.

  • 사용자 지정 특성은 연결된 항목이 병합될 때만 병합됩니다. 예를 들어 클래스와 연결된 사용자 지정 특성은 클래스가 처음 발견될 때 병합됩니다. 사용자 정의 속성이 컴파일 단위에 특정한 TypeDef 또는 MemberDef와 연결된 경우(예: 멤버 컴파일의 타임스탬프) 병합되지 않으며 이러한 메타데이터를 제거하거나 업데이트하는 것은 컴파일러에 달려 있습니다.

요구 사항

플랫폼:시스템 요구 사항을 참조하세요.

헤더: Cor.h

라이브러리: MsCorEE.dll에서 리소스로 사용됨

.NET Framework 버전: 1.1부터 사용 가능

참고 항목