Метод ICorDebugProcess6::EnableVirtualModuleSplitting

Позволяет включить или отключить разделение виртуальных модулей.

Синтаксис

HRESULT EnableVirtualModuleSplitting(  
   BOOL enableSplitting  
);  

Параметры

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

Комментарии

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

Примечание

Этот метод доступен только в машинном коде .NET.

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

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

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

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

вложенные модули или виртуальные модули
Модули, находящиеся в контейнере.

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

Контейнерные модули и вложенные модули представляются объектами интерфейса ICorDebugModule. Однако поведение интерфейса в каждом случае немного отличается, как описано в <разделе x-ref to section> .

Модули и сборки

Сборки с несколькими модулями не поддерживаются для сценариев объединения сборок, поэтому существует однозначное соответствие между модулем и сборкой. Каждый объект 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-код в образе сборки после слияния.

Требования

Платформы: см. раздел Требования к системе.

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

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

версии платформа .NET Framework: доступно с версии 4.6, только .NET Native

См. также раздел