Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Habilita ou desabilita a divisão do módulo virtual.
Sintaxe
HRESULT EnableVirtualModuleSplitting(
BOOL enableSplitting
);
Parâmetros
enableSplitting
true para habilitar a divisão de módulo virtual; false para desabilitá-lo.
Observações
A divisão de módulos virtuais faz com que o ICorDebug reconheça módulos que foram mesclados durante o processo de build e os apresentem 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.
Observação
Esse método está disponível apenas com o .NET Native.
Esse método pode ser chamado e o valor pode enableSplitting ser alterado a qualquer momento. Ele não causa alterações funcionais com estado em um objeto ICorDebug , além de alterar o comportamento dos métodos listados na divisão do módulo virtual e a seção de APIs de depuração não gerenciadas no momento em que são chamadas. O uso de módulos virtuais incorre em uma penalidade de desempenho ao chamar esses métodos. Além disso, o 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 do módulo virtual:
módulos de contêiner ou contêineres Os módulos de agregação.
sub-mó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 subprojetos.
Os módulos de contêiner e os sub-módulos são representados por ICorDebugModule objetos de interface. No entanto, o comportamento da interface é ligeiramente diferente em cada caso.
Módulos e assemblies
Não há suporte para assemblies de vários módulos para cenários de mesclagem de assembly, portanto, há uma relação um-para-um entre um módulo e um assembly. Cada ICorDebugModule objeto, independentemente de representar um módulo de contêiner ou um subprocurador, tem um objeto ICorDebugAssembly correspondente. O método ICorDebugModule::GetAssembly é convertido do módulo para o assembly. Para mapear na outra direção, o método ICorDebugAssembly::EnumerateModules enumera apenas 1 módulo. Como o assembly e o módulo formam um par firmemente acoplado nesse caso, o assembly e o módulo de termos tornam-se em grande parte intercambiáveis.
Diferenças comportamentais
Os módulos de contêiner têm os seguintes comportamentos e características:
Seus metadados para todos os subprocursores constituintes são mesclados.
Seus nomes de tipo podem ser mutilados.
O método ICorDebugModule::GetName retorna o caminho para um módulo em disco.
O método ICorDebugModule::GetSize retorna o tamanho dessa imagem.
O método ICorDebugAssembly3.EnumerateContainedAssemblies lista os sub-módulos.
O método ICorDebugAssembly3.GetContainerAssembly retorna
S_FALSE.
Os subprocursores 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 de metadados não são mutilados.
É improvável que os tokens de metadados correspondam aos tokens no assembly original antes de serem mesclados no processo de build.
O método ICorDebugModule::GetName retorna o nome do assembly, não um caminho de arquivo.
O método ICorDebugModule::GetSize retorna o tamanho original da imagem não mesclada.
O método ICorDebugModule3.EnumerateContainedAssemblies retorna
S_FALSE.O método ICorDebugAssembly3.GetContainerAssembly retorna o módulo que contém.
Interfaces recuperadas de módulos
Uma variedade de interfaces pode ser criada ou recuperada 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 são sempre armazenados em cache pelo ICorDebug e terão a mesma identidade de ponteiro, independentemente de terem sido criados ou consultados do módulo de contêiner ou de um subprocurador. O subprocurador 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ódulo virtual e as 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 | Retorna o subprocurso em que essa função foi originalmente definida | Retorna o módulo de contêiner em que essa função foi mesclada |
| ICorDebugClass::GetModule | Retorna o subprocurso em que 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. Subprocuradores 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 subconjuntos e assemblies regulares; nenhum assembli 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 poderá ou não ser enumerado. | Retorna uma lista de assemblies de contêiner e assemblies regulares; nenhum subconjunto está incluído. Nota: Se algum assembly regular estiver faltando símbolos, ele poderá ou não ser enumerado. |
| ICorDebugCode::GetCode (ao se referir somente ao código IL) | Retorna IL que seria válido em uma imagem de assembly de pré-mesclagem. Especificamente, todos os tokens de metadados embutidos serão corretamente tokens TypeRef ou MemberRef quando os tipos que estão sendo referenciados não forem 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 do assembly pós-mesclagem. |
Requirements
Plataformas: Consulte sistemas operacionais com suporte do .NET.
Cabeçalho: CorDebug.idl, CorDebug.h
Biblioteca: CorGuids.lib
Versões do .NET: Disponível desde o .NET Framework 4.6