Metodo ICorDebugProcess6::EnableVirtualModuleSplitting
Abilita o disabilita la suddivisione dei moduli virtuali.
Sintassi
HRESULT EnableVirtualModuleSplitting(
BOOL enableSplitting
);
Parametri
enableSplitting
true
per abilitare la suddivisione dei moduli virtuali; false
per disabilitarla.
Osservazioni:
La suddivisione di moduli virtuali fa sì che ICorDebug riconosca i moduli uniti durante il processo di compilazione e li presenti come gruppo di moduli separati anziché come un singolo modulo di grandi dimensioni. In questo modo viene modificato il comportamento di vari metodi ICorDebug descritti di seguito.
Nota
Questo metodo è disponibile solo con .NET Native.
In qualsiasi momento è possibile chiamare questo metodo e modificare il valore di enableSplitting
. Non causa modifiche funzionali con stato in un oggetto ICorDebug , oltre a modificare il comportamento dei metodi elencati nella divisione del modulo virtuale e la sezione API di debug non gestite al momento della chiamata. L'uso dei moduli virtuali ha effetti negativi sulle prestazioni quando si chiamano questi metodi. Inoltre, potrebbe essere necessaria una memorizzazione significativa nella cache in memoria dei metadati virtualizzati per implementare correttamente le API IMetaDataImport e queste cache possono essere mantenute anche dopo la disattivazione della suddivisione del modulo virtuale.
Terminologia
Nella descrizione della suddivisione dei moduli virtuali vengono usati i seguenti termini:
moduli contenitore o contenitori Moduli di aggregazione.
moduli secondari o moduli virtuali I moduli trovati in un contenitore.
moduli regolari non uniti in fase di compilazione. Non corrispondono né ai moduli del contenitore né ai moduli secondari.
I moduli contenitore e i moduli secondari sono rappresentati da oggetti di interfaccia ICorDebugModule. Tuttavia, il comportamento dell'interfaccia è leggermente diverso in ogni caso, come descritto nella <sezione x-ref to section> .
Moduli e assembly
Gli assembly a più moduli non sono supportati per gli scenari di unione degli assembly, quindi esiste una relazione uno a uno tra un modulo e un assembly. Ogni oggetto ICorDebugModule, indipendentemente dal fatto che rappresenti un modulo contenitore o un sottomodulo, abbia un oggetto ICorDebugAssembly corrispondente. Il metodo ICorDebugModule::GetAssembly converte dal modulo all'assembly. Per eseguire il mapping nell'altra direzione, il metodo ICorDebugAssembly::EnumerateModules enumera solo 1 modulo. In questo caso l'assembly e il modulo formano una coppia strettamente collegata, quindi i termini assembly e modulo sono quasi del tutto intercambiabili.
Differenze di comportamento
I moduli del contenitore hanno i seguenti comportamenti e caratteristiche:
I metadati relativi a tutti i moduli secondari costitutivi sono uniti insieme.
I nomi del tipo possono essere alterati.
Il metodo ICorDebugModule::GetName restituisce il percorso di un modulo su disco.
Il metodo ICorDebugModule::GetSize restituisce le dimensioni dell'immagine.
Il metodo ICorDebugAssembly3.EnumerateContainedAssemblies elenca i moduli secondari.
Il metodo ICorDebugAssembly3.GetContainerAssembly restituisce
S_FALSE
.
I moduli secondari hanno i seguenti comportamenti e caratteristiche:
Hanno un set di metadati limitato che corrisponde solo all'assembly originale unito.
I nomi dei metadati non possono essere alterati.
I token dei metadati solitamente non corrispondono ai token nell'assembly originale precedente al merge durante il processo di compilazione.
Il metodo ICorDebugModule::GetName restituisce il nome dell'assembly, non un percorso di file.
Il metodo ICorDebugModule::GetSize restituisce le dimensioni originali dell'immagine non archiviata.
Il metodo ICorDebugModule3.EnumerateContainedAssemblies restituisce
S_FALSE
.Il metodo ICorDebugAssembly3.GetContainerAssembly restituisce il modulo contenitore.
Interfacce recuperate dai moduli
Dai moduli è possibile creare o recuperare diverse interfacce, tra cui:
Oggetto ICorDebugClass, restituito dal metodo ICorDebugModule::GetClassFromToken .
Oggetto ICorDebugAssembly, restituito dal metodo ICorDebugModule::GetAssembly .
Questi oggetti vengono sempre memorizzati nella cache da ICorDebug e avranno la stessa identità del puntatore indipendentemente dal fatto che siano stati creati o sottoposti a query dal modulo contenitore o da un sottomodulo. Il modulo secondario fornisce una visualizzazione filtrata di questi oggetti nella cache, non una cache separata con delle proprie copie.
Suddivisione dei moduli virtuali e API di debug non gestite
La tabella seguente illustra in che modo la suddivisione dei moduli virtuali influisce sul comportamento degli altri metodi nell'API di debug non gestita.
metodo | enableSplitting = true |
enableSplitting = false |
---|---|---|
ICorDebugFunction::GetModule | Restituisce il modulo secondario in cui questa funzione è stata definita in origine | Restituisce il modulo del contenitore a cui questa funzione è stata unita |
ICorDebugClass::GetModule | Restituisce il modulo secondario in cui questa classe è stata definita in origine. | Restituisce il modulo del contenitore a cui questa classe è stata unita. |
ICorDebugModuleDebugEvent::GetModule | Restituisce il modulo del contenitore caricato. I moduli secondari non vengono associati a eventi di caricamento a prescindere da questa impostazione. | Restituisce il modulo del contenitore caricato. |
ICorDebugAppDomain::EnumerateAssemblies | Restituisce un elenco di assembly secondari e normali. Non sono inclusi assembly del contenitore. Nota: se manca un assembly di contenitori, nessuno dei relativi assembly secondari verrà enumerato. Se mancano i simboli in qualsiasi assembly normale, l'enumerazione potrebbe essere eseguita. | Restituisce un elenco di assembly del contenitore e normali; non sono inclusi assembly secondari. Nota: se un assembly regolare non contiene simboli, potrebbe essere o meno enumerato. |
ICorDebugCode::GetCode (solo quando si fa riferimento al codice IL) | Restituisce IL, valido in un'immagine di assembly pre-merge. In particolare, quando i tipi a cui si fa riferimento non sono definiti nel modulo virtuale che contiene IL, gli eventuali token di metadati inline corrispondono correttamente a TypeRef o MemberRef. Questi token TypeRef o MemberRef possono essere cercati nell'oggetto IMetaDataImport per l'oggetto ICorDebugModule virtuale corrispondente. | Restituisce IL nell'immagine di assembly post-unione. |
Requisiti
Piattaforme: vedere Requisiti di sistema.
Intestazione: CorDebug.idl, CorDebug.h
Libreria: CorGuids.lib
Versioni di .NET Framework: disponibili solo dalla versione 4.6, .NET Native