다음을 통해 공유


ICorDebugProcess6::EnableVirtualModuleSplitting 메서드

가상 모듈 분할을 사용하거나 사용하지 않도록 설정합니다.

Syntax

HRESULT EnableVirtualModuleSplitting(
   BOOL enableSplitting
);

매개 변수

enableSplitting true 가상 모듈 분할을 사용하도록 설정하려면 false 을(를) 사용하지 않도록 설정합니다.

비고

가상 모듈 분할로 인해 ICorDebug 는 빌드 프로세스 중에 함께 병합된 모듈을 인식하고 단일 큰 모듈이 아닌 별도의 모듈 그룹으로 표시합니다. 이렇게 하면 아래에 설명된 다양한 ICorDebug 메서드의 동작이 변경됩니다.

비고

이 메서드는 .NET 네이티브에서만 사용할 수 있습니다.

이 메서드를 호출할 수 있으며 값은 enableSplitting 언제든지 변경할 수 있습니다. 가상 모듈 분할에 나열된 메서드의 동작과 호출될 때 관리되지 않는 디버깅 API 섹션을 변경하는 것 외에는 ICorDebug 개체의 상태 저장 기능이 변경되지 않습니다. 가상 모듈을 사용하면 이러한 메서드를 호출할 때 성능 저하가 발생합니다. 또한 IMetaDataImport API를 올바르게 구현하려면 가상화된 메타데이터의 상당한 메모리 내 캐싱이 필요할 수 있으며 가상 모듈 분할이 해제된 후에도 이러한 캐시가 유지될 수 있습니다.

용어

다음 용어는 가상 모듈 분할을 설명할 때 사용됩니다.

컨테이너 모듈 또는 컨테이너 집계 모듈입니다.

하위 모듈 또는 가상 모듈 컨테이너에 있는 모듈입니다.

빌드 시 병합되지 않은 일반 모듈 모듈입니다. 컨테이너 모듈이나 하위 모듈은 아닙니다.

컨테이너 모듈과 하위 모듈은 모두 인터페이스 개체로 ICorDebugModule 표시됩니다. 그러나 인터페이스의 동작은 각 경우에 약간 다릅니다.

모듈 및 어셈블리

다중 모듈 어셈블리는 어셈블리 병합 시나리오에서 지원되지 않으므로 모듈과 어셈블리 간에 일대일 관계가 있습니다. 컨테이너 모듈을 나타내는지 하위 모듈을 나타내는지에 관계없이 각 ICorDebugModule 개체에는 해당 ICorDebugAssembly 개체가 있습니다. ICorDebugModule::GetAssembly 메서드는 모듈에서 어셈블리로 변환됩니다. 다른 방향으로 매핑하기 위해 ICorDebugAssembly::EnumerateModules 메서드는 1개의 모듈만 열거합니다. 이 경우 어셈블리와 모듈이 긴밀하게 결합된 쌍을 형성하기 때문에 어셈블리와 모듈이라는 용어는 대체로 서로 교환할 수 있습니다.

동작 차이

컨테이너 모듈에는 다음과 같은 동작과 특징이 있습니다.

  • 모든 구성 하위 모듈에 대한 메타데이터가 함께 병합됩니다.

  • 형식 이름이 망가질 수 있습니다.

  • ICorDebugModule::GetName 메서드는 디스크에 있는 모듈의 경로를 반환합니다.

  • ICorDebugModule::GetSize 메서드는 해당 이미지의 크기를 반환합니다.

  • ICorDebugAssembly3.EnumerateContainedAssemblies 메서드는 하위 모듈을 나열합니다.

  • ICorDebugAssembly3.GetContainerAssembly 메서드가 반환됩니다 S_FALSE.

하위 모듈에는 다음과 같은 동작과 특징이 있습니다.

  • 병합된 원래 어셈블리에만 해당하는 축소된 메타데이터 집합이 있습니다.

  • 메타데이터 이름이 얽혀 있지 않습니다.

  • 메타데이터 토큰은 빌드 프로세스에서 병합되기 전에 원래 어셈블리의 토큰과 일치하지 않을 수 있습니다.

  • ICorDebugModule::GetName 메서드는 파일 경로가 아닌 어셈블리 이름을 반환합니다.

  • ICorDebugModule::GetSize 메서드는 원래의 이미지 크기를 반환합니다.

  • ICorDebugModule3.EnumerateContainedAssemblies 메서드가 반환됩니다 S_FALSE.

  • ICorDebugAssembly3.GetContainerAssembly 메서드는 포함하는 모듈을 반환합니다.

모듈에서 검색된 인터페이스

모듈에서 다양한 인터페이스를 만들거나 검색할 수 있습니다. 그 중 일부는 다음과 같습니다.

이러한 개체는 항상 ICorDebug에 의해 캐시되며 컨테이너 모듈 또는 하위 모듈에서 생성 또는 쿼리되었는지 여부에 관계없이 동일한 포인터 ID를 갖습니다. 하위 모듈은 자체 복사본이 있는 별도의 캐시가 아니라 이러한 캐시된 개체의 필터링된 보기를 제공합니다.

가상 모듈 분할 및 관리되지 않는 디버깅 API

다음 표에서는 가상 모듈 분할이 관리되지 않는 디버깅 API의 다른 메서드 동작에 미치는 영향을 보여 줍니다.

메서드 enableSplitting = true enableSplitting = false
ICorDebugFunction::GetModule 이 함수가 원래 정의된 하위 모듈을 반환합니다. 이 함수가 병합된 컨테이너 모듈을 반환합니다.
ICorDebugClass::GetModule 이 클래스가 원래 정의된 하위 모듈을 반환합니다. 이 클래스가 병합된 컨테이너 모듈을 반환합니다.
ICorDebugModuleDebugEvent::GetModule 로드된 컨테이너 모듈을 반환합니다. 하위 모듈에는 이 설정에 관계없이 로드 이벤트가 제공되지 않습니다. 로드된 컨테이너 모듈을 반환합니다.
ICorDebugAppDomain::EnumerateAssemblies 하위 어셈블리 및 일반 어셈블리 목록을 반환합니다. 컨테이너 어셈블리가 포함되지 않습니다. 메모: 컨테이너 어셈블리에 기호가 없으면 해당 하위 어셈블리가 열거되지 않습니다. 일반 어셈블리에 기호가 없는 경우 열거되거나 열거되지 않을 수 있습니다. 컨테이너 어셈블리 및 일반 어셈블리 목록을 반환합니다. 하위 어셈블리가 포함되지 않습니다. 메모: 일반 어셈블리에 기호가 없는 경우 열거되거나 열거되지 않을 수 있습니다.
ICorDebugCode::GetCode (IL 코드만 참조하는 경우) 병합 전 어셈블리 이미지에서 유효한 IL을 반환합니다. 특히 참조되는 형식이 IL을 포함하는 가상 모듈에 정의되지 않은 경우 인라인 메타데이터 토큰은 TypeRef 또는 MemberRef 토큰이 올바르게 됩니다. 해당 가상 ICorDebugModule 개체에 대한 IMetaDataImport 개체에서 이러한 TypeRef 또는 MemberRef 토큰을 조회할 수 있습니다. 병합 후 어셈블리 이미지에서 IL을 반환합니다.

요구 사항

플랫폼:.NET 지원 운영 체제를 참조하세요.

머리글: CorDebug.idl, CorDebug.h

도서관: CorGuids.lib

.NET 버전: .NET Framework 4.6 이후 사용 가능

참고하십시오