Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Включает или отключает разделение виртуального модуля.
Синтаксис
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