Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Включает или отключает разделение виртуального модуля.
Синтаксис
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 возвращает содержащий модуль.
Интерфейсы, полученные из модулей
Различные интерфейсы можно создавать или извлекать из модулей. Ниже перечислены некоторые из них.
Объект 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 в образе сборки после слияния. |
Требования
Платформ: См. сведения о поддерживаемых операционных системах .NET.
Заголовок: CorDebug.idl, CorDebug.h
Библиотека: CorGuids.lib
Версии .NET: Доступно с версии .NET Framework 4.6