Метод ICorDebugProcess6::EnableVirtualModuleSplitting
Позволяет включить или отключить разделение виртуальных модулей.
Синтаксис
HRESULT EnableVirtualModuleSplitting(
BOOL enableSplitting
);
Параметры
enableSplitting
true
, чтобы включить разделение виртуальных модулей; false
, чтобы отключить его.
Замечания
Разделение виртуального модуля приводит к тому, что ICorDebug распознает модули, которые были объединены в процессе сборки и представляют их как группу отдельных модулей, а не один большой модуль. Это изменяет поведение различных методов ICorDebug , описанных ниже.
Примечание.
Этот метод доступен только в машинном коде .NET.
Этот метод может быть вызван, и значение enableSplitting
может быть изменено, в любое время. Он не вызывает никаких функциональных изменений с отслеживанием состояния в объекте ICorDebug , кроме изменения поведения методов, перечисленных в разделе "Разделение виртуального модуля" и неуправляемых api-интерфейсов отладки во время их вызова. Применение виртуальных модулей приводит к ухудшению производительности при вызове этих методов. Кроме того, для правильной реализации API IMetaDataImport может потребоваться значительное кэширование в памяти, и эти кэши могут храниться даже после отключения разделения виртуального модуля.
Терминология
При описании разделения виртуальных модулей используются следующие термины:
модули контейнеров или контейнеры агрегатных модулей.
вложенные модули или виртуальные модули, найденные в контейнере.
регулярные модули, которые не были объединены во время сборки. Они не являются ни вложенными, ни контейнерными модулями.
Модули контейнеров и вложенные модули представлены объектами интерфейса ICorDebugModule. Однако поведение интерфейса немного отличается в каждом случае, так как <x-ref в разделе раздела> описывается.
Модули и сборки
Сборки с несколькими модулями не поддерживаются для сценариев объединения сборок, поэтому существует однозначное соответствие между модулем и сборкой. Каждый объект 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 возвращает составной модуль.
Интерфейсы, извлеченные из модулей
Из модулей можно создать или извлечь различные интерфейсы. Ниже перечислены некоторые из них.
Объект ICorDebugClass, возвращаемый методом ICorDebugModule::GetClassFromToken .
Объект ICorDebugAssembly, возвращаемый методом ICorDebugModule::GetAssembly .
Эти объекты всегда кэшируются 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-код в образе сборки после слияния. |
Требования
Платформы: см. раздел Требования к системе.
Заголовок: CorDebug.idl, CorDebug.h
Библиотека: CorGuids.lib
версии платформа .NET Framework: Доступно только с версии 4.6, .NET Native