Método ICorDebugProcess6::EnableVirtualModuleSplitting
Habilita ou desabilita a divisão de módulo virtual.
Sintaxe
HRESULT EnableVirtualModuleSplitting(
BOOL enableSplitting
);
Parâmetros
enableSplitting
true
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:
Um objeto ICorDebugClass, que é retornado pelo método ICorDebugModule::GetClassFromToken.
Um objeto ICorDebugAssembly, que é retornado pelo método ICorDebugModule::GetAssembly.
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