IMetaDataEmit::MergeEnd 메서드
이전에 IMetaDataEmit::Merge를 한 번 이상 호출하여 지정된 모든 메타데이터 범위를 현재 범위에 병합합니다.
HRESULT MergeEnd ();
매개 변수
이 메서드는 매개 변수를 사용하지 않습니다.
설명
이 루틴은 메타데이터의 실제 병합을 트리거합니다. 특히, 이전에 IMetaDataEmit::Merge를 호출할 때 지정한 범위를 현재 출력 범위로 가져옵니다.
병합에는 다음과 같은 특수 조건이 적용됩니다.
MVID(모듈 버전 식별자)는 가져오기 범위의 메타데이터에 고유하므로 가져올 수 없습니다.
기존의 모듈 수준 속성은 덮어쓰여집니다.
현재 범위에 모듈 속성이 이미 설정되어 있으면 모듈 속성을 가져올 수 없습니다. 그러나 현재 범위에 모듈 속성이 설정되지 않은 경우에는 모듈 속성이 처음 발견할 때 한 번만 가져올 수 있습니다. 해당 모듈 속성이 다시 발견되면 모듈 속성이 중복됩니다. MVID를 제외한 모든 모듈 속성 값을 비교한 결과 중복되는 속성이 없으면 오류가 발생합니다.
형식 정의(TypeDef)의 경우 중복되는 항목은 현재 범위에 병합되지 않습니다. TypeDef 개체는 각 fully-qualified object name + GUID + version number를 기준으로 중복 여부가 확인됩니다. 이름이나 GUID가 일치하는 항목이 있고 다른 두 개의 요소가 하나라도 다르면 오류가 발생합니다. 그렇지 않고 세 개의 요소가 모두 일치하면 MergeEnd는 대략적인 검사를 수행하여 항목이 실제로 중복되는지 확인하고 중복 항목이 없으면 오류를 발생시킵니다. 이 대략적인 검사에서는 다음과 같은 항목을 찾습니다.
동일한 순서로 발생하는 동일한 멤버 선언. mdPrivateScope로 플래그가 지정된 멤버(CorMethodAttr 열거형 참조)는 이 검사에 포함되지 않으며 특별한 방식으로 병합됩니다.
동일한 클래스 레이아웃
즉, TypeDef 개체는 해당 개체가 선언된 모든 메타데이터 범위에서 항상 완전하고 일관되게 정의되어 있어야 합니다. 클래스의 해당 멤버 구현이 여러 컴파일 단위에 분산된 경우에는 전체 정의가 모든 범위에 있고 각 범위에 증분되지 않은 것으로 간주됩니다. 예를 들어 매개 변수 이름이 계약과 관련된 경우 해당 이름은 모든 범위에 동일한 방식으로 내보내야 합니다. 매개 변수 이름이 계약과 관련되지 않은 경우에는 해당 이름을 메타데이터로 내보내지 말아야 합니다.
단, TypeDef 개체의 경우에는 mdPrivateScope로 플래그가 지정된 증분 멤버를 포함할 수 있습니다. 이러한 증분 멤버가 있으면 MergeEnd는 중복과 관계없이 현재 범위에 해당 멤버를 증분 방식으로 추가합니다. 컴파일러에서는 전용 범위를 인식하므로 컴파일러에서 규칙을 적용해야 합니다.
RVA(상대 가상 주소)는 가져오거나 병합할 수 없습니다. 따라서 컴파일러에서 이 정보를 다시 내보내야 합니다.
사용자 지정 특성은 해당 특성이 연결된 항목이 병합되는 경우에만 병합됩니다. 예를 들어, 클래스와 연결된 사용자 지정 특성은 해당 클래스가 처음 발견될 때 병합됩니다. 사용자 지정 특성이 멤버 컴파일의 타임스탬프와 같은 컴파일 단위와 관련된 TypeDef 또는 MemberDef에 연결되어 있는 경우 이러한 특성은 병합되지 않으며 컴파일러에서 해당 메타데이터를 제거할지 아니면 업데이트할지 결정합니다.
요구 사항
플랫폼: .NET Framework 시스템 요구 사항 참조
헤더: Cor.h
라이브러리: MSCorEE.dll에서 리소스로 사용됨
.NET Framework 버전: 4, 3.5 SP1, 3.5, 3.0 SP1, 3.0, 2.0 SP1, 2.0, 1.1