Поделиться через


Метод ICorDebugProcess6::EnableVirtualModuleSplitting

Включает или отключает разделение виртуального модуля.

Синтаксис

HRESULT EnableVirtualModuleSplitting(
   BOOL enableSplitting
);

Параметры

enableSplitting true для включения разделения виртуального модуля; false чтобы отключить его.

Замечания

Разделение виртуального модуля приводит к тому, что ICorDebug распознает модули, которые были объединены в процессе сборки и представляют их как группу отдельных модулей, а не один большой модуль. Это изменяет поведение различных методов ICorDebug , описанных ниже.

Замечание

Этот метод доступен только для .NET Native.

Этот метод можно вызвать и изменить значение enableSplitting в любое время. Он не вызывает никаких функциональных изменений с отслеживанием состояния в объекте ICorDebug , кроме изменения поведения методов, перечисленных в разделе "Разделение виртуального модуля" и неуправляемых api-интерфейсов отладки во время их вызова. Использование виртуальных модулей приводит к штрафу производительности при вызове этих методов. Кроме того, для правильной реализации API IMetaDataImport может потребоваться значительное кэширование в памяти, и эти кэши могут храниться даже после отключения разделения виртуального модуля.

Терминология

При описании разделения виртуального модуля используются следующие термины:

модули контейнеров или контейнеры агрегатных модулей.

вложенные модули или виртуальные модули, найденные в контейнере.

регулярные модули, которые не были объединены во время сборки. Они не являются модулями контейнеров и вложенными модулями.

Модули контейнеров и вложенные модули представлены 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, и они будут иметь одно и то же удостоверение указателя независимо от того, были ли они созданы или запрашиваются из модуля контейнера или вложенного модуля. Вложенный модуль предоставляет отфильтрованное представление этих кэшированных объектов, а не отдельный кэш с собственными копиями.

Разделение виртуального модуля и неуправляемые API отладки

В следующей таблице показано, как разделение виртуального модуля влияет на поведение других методов в неуправляемом API отладки.

Метод enableSplitting = true enableSplitting = false
ICorDebugFunction::GetModule Возвращает вложенный модуль, в который изначально была определена эта функция. Возвращает модуль контейнера, который эта функция была объединена в
ICorDebugClass::GetModule Возвращает вложенный модуль, в который изначально был определен этот класс. Возвращает модуль контейнера, в который был объединен этот класс.
ICorDebugModuleDebugEvent::GetModule Возвращает модуль контейнера, загруженный. Вложенные модули не получают события загрузки независимо от этого параметра. Возвращает модуль контейнера, загруженный.
ICorDebugAppDomain::EnumerateAssemblies Возвращает список вложенных сборок и обычных сборок; сборки контейнеров не включены. Заметка: Если какая-либо сборка контейнера отсутствует, ни одна из ее вложенных сборок не будет перечислена. Если какая-либо обычная сборка отсутствует, она может быть перечислена или не может быть перечислена. Возвращает список сборок контейнеров и регулярных сборок; вложенные сборки не включены. Заметка: Если какая-либо обычная сборка отсутствует, она может быть перечислена или не может быть перечислена.
ICorDebugCode::GetCode (только при ссылке на код IL) Возвращает il, допустимый в образе сборки предварительного слияния. В частности, все встроенные маркеры метаданных правильно будут иметь маркеры TypeRef или MemberRef, если указанные типы не определены в виртуальном модуле, содержащего IL. Эти маркеры TypeRef или MemberRef можно найти в объекте IMetaDataImport для соответствующего виртуального ICorDebugModule объекта. Возвращает IL в образе сборки после слияния.

Требования

Платформ: См. сведения о поддерживаемых операционных системах .NET.

Заголовок: CorDebug.idl, CorDebug.h

Библиотека: CorGuids.lib

Версии .NET: Доступно с версии .NET Framework 4.6

См. также