Compartilhar via


Método ICorDebugProcess6::EnableVirtualModuleSplitting

Habilita ou desabilita a divisão de módulo virtual.

Sintaxe

HRESULT EnableVirtualModuleSplitting(
   BOOL enableSplitting
);

Parâmetros

enableSplittingtrue para habilitar a divisão de módulo virtual; false para desabilitá-la.

Comentários

A divisão de módulo virtual faz com que o ICorDebug reconheça os 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. Isso altera o comportamento de vários métodos ICorDebug descritos abaixo.

Observação

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

Esse método pode ser chamado e o valor de enableSplitting pode ser alterado a qualquer momento. Isso não causa nenhuma alteração funcionais de estado em um objeto ICorDebug, exceto alterar o comportamento dos métodos listados na seção Divisão de módulo virtual e das APIs de depuração não gerenciadas no momento em que eles são chamados. Usar módulos virtuais provoca uma perda de desempenho ao chamar esses métodos. Além disso, pode ser necessário implantar um significativo armazenamento em cache na memória dos metadados virtualizados para implementar as APIs IMetaDataImport corretamente, e esses caches podem ser retidos mesmo após a divisão do módulo virtual ser desativada.

Terminologia

Os seguintes termos são usados para descrever a divisão do módulo virtual:

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. Eles não são módulos de contêiner nem submódulos.

Os módulos do contêiner e submódulos são representados por objetos de interface ICorDebugModule. No entanto, o comportamento da interface é ligeiramente diferente em cada caso, como descrito na seção <referência cruzada para a seção>.

Módulos e assemblies

Vários assemblies de módulo não são suportados para cenários de mesclagem de assembly, portanto, há um relacionamento individual entre um módulo e um assembly. Cada objeto ICorDebugModule, independentemente se ele representa um módulo de contêiner ou um submódulo, possui um objeto ICorDebugAssembly correspondente. O método ICorDebugModule::GetAssembly é convertido de módulo para assembly. Para mapear a outra direção, o método ICorDebugAssembly::EnumerateModules enumera apenas um módulo. Como o assembly e o module formam um par de ligação estreita nesse caso, os termos assembly e módulo se tornar sinônimos.

Diferenças de comportamento

Módulos de contêiner têm as seguintes características e comportamentos:

  • Seus metadados para todos os submódulos constituintes é mesclado.

  • Seus nomes de tipos podem ser danificados.

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

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

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

  • O método ICorDebugAssembly3.GetContainerAssembly retorna S_FALSE.

Submódulos têm as seguintes características e comportamentos:

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

  • Os nomes de metadados não são danificados.

  • Os tokens de metadados dificilmente correspondem aos tokens do assembly original antes de ser mesclado no processo de compilação.

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

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

  • O método ICorDebugModule3.EnumerateContainedAssemblies retorna S_FALSE.

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

Interfaces obtidas de módulos

Uma variedade de interfaces pode ser criada ou obtida de módulos. Entre eles estão:

Esses objetos sempre são armazenados em cache pelo ICorDebug e têm a mesma identidade de ponteiro independentemente de serem 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 em cache, não um cache separado com suas própria cópias.

Divisão do módulo virtual e APIs de depuração não gerenciadas

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

Método enableSplitting = true enableSplitting = false
ICorDebugFunction::GetModule Retorna o submódulo no qual essa função foi originalmente definida. Retorna o módulo recipiente ao qual essa função foi mesclada.
ICorDebugClass::GetModule Retorna o submódulo no qual essa classe foi originalmente definida. Retorna o módulo recipiente ao qual essa classe foi mesclada.
ICorDebugModuleDebugEvent::GetModule Retorna o módulo recipiente que foi carregado. Submódulos não recebem eventos de carga independente dessa configuração. Retorna o módulo recipiente que foi carregado.
ICorDebugAppDomain::EnumerateAssemblies Retorna uma lista de sub-assemblies e assemblies regulares; nenhum assembly contêiner está incluído. Observação: Se qualquer assembly contêiner tiver símbolos ausentes, nenhum dos seus sub-assemblies será enumerado. Se qualquer assembly regular estiver com símbolos ausentes, ele pode ou não ser enumerado. Retorna uma lista de assemblies recipientes e assemblies regulares; nenhum assembly contêiner está incluído. Observação: Se qualquer assembly regular estiver com símbolos ausentes, ele pode ou não ser enumerado.
ICorDebugCode::GetCode (somente quando se referir a código IL) Retorna IL que seria válido em uma imagem de assembly pré-mesclagem. Especificamente, qualquer tokens de metadados embutido serão corretamente tokens TypeRef ou MemberRef quando os tipos sendo mencionados não são definidos no módulo virtual que contém o IL. Esses tokens TypeRef ou MemberRef podem ser pesquisados no objeto IMetaDataImport para o objeto virtual ICorDebugModule correspondente. Retorna o IL na imagem de assembly pós-mesclagem.

Requisitos

Plataformas: confira Requisitos do sistema.

Cabeçalho: CorDebug.idl, CorDebug.h

Biblioteca: CorGuids.lib

Versões do .NET Framework: disponíveis desde 4.6, somente .NET Native

Confira também