Partilhar via


Método ICorDebugProcess6::EnableVirtualModuleSplitting

Habilita ou desabilita a divisão de módulos virtuais.

Sintaxe

HRESULT EnableVirtualModuleSplitting(
   BOOL enableSplitting
);

Parâmetros

enableSplittingtrue para permitir a divisão de módulos virtuais; false para desativá-lo.

Observações

A divisão de módulos virtuais faz com que ICorDebug reconheça módulos que foram mesclados durante o processo de compilação e apresente-os como um grupo de módulos separados em vez de um único módulo grande. Fazer isso altera o comportamento de vários métodos ICorDebug descritos abaixo.

Nota

Esse método está disponível apenas com o .NET Native.

Este método pode ser chamado e o valor de enableSplitting pode ser alterado a qualquer momento. Ele não causa nenhuma alteração funcional com estado em um objeto ICorDebug , além de alterar o comportamento dos métodos listados na divisão do módulo virtual e na seção APIs de depuração não gerenciadas no momento em que são chamados. O uso de módulos virtuais incorre em uma penalidade de desempenho ao chamar esses métodos. Além disso, um cache significativo na memória dos metadados virtualizados pode ser necessário para implementar corretamente as APIs IMetaDataImport, e esses caches podem ser mantidos mesmo após a divisão do módulo virtual ter sido desativada.

Terminologia

Os seguintes termos são usados ao descrever a divisão de módulos virtuais:

módulos de contêiner, ou contêineres Os módulos agregados.

submódulos ou módulos virtuais Os módulos encontrados em um contêiner.

módulos regulares Módulos que não foram mesclados no momento da compilação. Não são módulos de contentores nem submódulos.

Ambos os módulos de contêiner e sub-módulos são representados por ICorDebugModule objetos de interface. No entanto, o comportamento da interface é ligeiramente diferente em cada caso, como a <seção x-ref to> descreve.

Módulos e montagens

Não há suporte para assemblies multimódulo para cenários de mesclagem de montagem, portanto, há uma relação um-para-um entre um módulo e um assembly. Cada objeto ICorDebugModule, independentemente de representar um módulo de contêiner ou um submódulo, tem um objeto ICorDebugAssembly correspondente. O ICorDebugModule::GetAssembly método converte do módulo para o assembly. Para mapear na outra direção, o ICorDebugAssembly::EnumerateModules método enumera apenas 1 módulo. Como montagem e módulo formam um par fortemente acoplado neste caso, os termos montagem e módulo tornam-se amplamente intercambiáveis.

Diferenças comportamentais

Os módulos de contêiner têm os seguintes comportamentos e características:

  • Os metadados de todos os submódulos constituintes são fundidos.

  • Os seus nomes de tipo podem ser emaranhados.

  • O método ICorDebugModule::GetName retorna o caminho para um módulo no disco.

  • O ICorDebugModule::GetSize método retorna o tamanho dessa imagem.

  • O método ICorDebugAssembly3.EnumerateContainedAssemblies lista os submódulos.

  • O ICorDebugAssembly3.GetContainerAssembly método retorna S_FALSE.

Os submódulos têm os seguintes comportamentos e características:

  • Eles têm um conjunto reduzido de metadados que corresponde apenas ao assembly original que foi mesclado.

  • Os nomes dos metadados não são emaranhados.

  • É improvável que os tokens de metadados correspondam aos tokens no assembly original antes de serem mesclados no processo de compilação.

  • O método ICorDebugModule::GetName retorna o nome do assembly, não um caminho de arquivo.

  • O ICorDebugModule::GetSize método retorna o tamanho original da imagem não mesclada.

  • O ICorDebugModule3.EnumerateContainedAssemblies método retorna S_FALSE.

  • O ICorDebugAssembly3.GetContainerAssembly método retorna o módulo que contém.

Interfaces recuperadas de módulos

Uma variedade de interfaces pode ser criada ou recuperada de módulos. Algumas delas incluem:

Esses objetos são sempre armazenados em cache por ICorDebug, e eles terão a mesma identidade de ponteiro, independentemente de terem sido criados ou consultados a partir do módulo de contêiner ou de um submódulo. O submódulo fornece uma exibição filtrada desses objetos armazenados em cache, não um cache separado com suas próprias cópias.

Divisão de módulos virtuais e APIs de depuração não gerenciadas

A tabela a seguir mostra como a divisão de módulos virtuais afeta o comportamento de outros métodos na API de depuração não gerenciada.

Método enableSplitting = true enableSplitting = false
ICorDebugFunction::GetModule Devolve o submódulo em que esta função foi originalmente definida Retorna o módulo de contêiner no qual esta função foi mesclada
ICorDebugClass::GetModule Retorna o submódulo no qual essa classe foi originalmente definida. Retorna o módulo de contêiner no qual essa classe foi mesclada.
ICorDebugModuleDebugEvent::GetModule Retorna o módulo de contêiner que foi carregado. Os submódulos não recebem eventos de carga, independentemente dessa configuração. Retorna o módulo de contêiner que foi carregado.
ICorDebugAppDomain::EnumerateAssemblies Retorna uma lista de submontagens e montagens regulares; Nenhum conjunto de contêiner está incluído. Nota: Se algum assembly de contêiner estiver faltando símbolos, nenhum de seus subconjuntos será enumerado. Se algum assembly regular estiver faltando símbolos, ele pode ou não ser enumerado. Retorna uma lista de assemblies de contêiner e assemblies regulares; não estão incluídos subconjuntos. Nota: Se algum assembly regular estiver faltando símbolos, ele pode ou não ser enumerado.
ICorDebugCode::GetCode (quando se refere apenas ao código IL) Retorna IL que seria válido em uma imagem de assembly pré-mesclagem. Especificamente, quaisquer tokens de metadados embutidos serão corretamente tokens TypeRef ou MemberRef quando os tipos referidos não estiverem definidos no módulo virtual que contém a IL. Esses tokens TypeRef ou MemberRef podem ser pesquisados no objeto IMetaDataImport para o objeto ICorDebugModule virtual correspondente. Retorna o IL na imagem de assembly pós-mesclagem.

Requisitos

Plataformas: Consulte Requisitos do sistema.

Cabeçalho: CorDebug.idl, CorDebug.h

Biblioteca: CorGuids.lib

Versões do .NET Framework: Disponível desde a versão 4.6, somente .NET Native

Consulte também