ICorDebugProcess6::EnableVirtualModuleSplitting-Methode
Aktiviert oder deaktiviert die virtuelle Modulteilung.
Syntax
HRESULT EnableVirtualModuleSplitting(
BOOL enableSplitting
);
Parameter
enableSplitting
true
, um die virtuelle Modulteilung zu aktivieren; false
, um sie zu deaktivieren.
Bemerkungen
Bedingt durch die Teilung virtueller Module erkennt ICorDebug Module, die während des Erstellungsvorgangs zusammengeführt wurden, verarbeitet und stellt sie als eine Gruppe von separaten Modulen und nicht als ein einziges großes Modul dar. Hierdurch ändert sich das Verhalten der verschiedenen unten beschriebenen ICorDebug-Methoden.
Hinweis
Diese Methode ist nur mit .NET Native verfügbar.
Diese Methode ist aufrufbar, und der enableSplitting
-Wert kann jederzeit geändert werden. Bewirkt abgesehen von der Änderung des Verhaltens der im Abschnitt Aufteilen virtueller Module nicht verwalteter Debug-APIs aufgeführten Methoden zum Zeitpunkt ihres Aufrufs keine zustandsbehafteten funktionalen Änderungen in einem ICorDebug-Objekt. Die Verwendung virtueller Module führt beim Aufrufen dieser Methoden durchaus zu Leistungseinbußen. Darüber hinaus können die virtualisierten Metadaten erheblichen Cache im Arbeitsspeicher erfordern, damit die IMetaDataImport-APIs korrekt implementiert werden können, und die Caches können auch beibehalten werden, nachdem das Teilen virtueller Module deaktiviert wurde.
Begriff
Die folgenden Begriffe werden verwendet, um das Teilen virtueller Module zu beschreiben:
Containermodule oder Container Die Aggregatmodule.
Untermodule oder virtuelle Module Die Module in einem Container.
reguläre Module, die zur Erstellungszeit nicht zusammengeführt wurden. Hierbei handelt es sich weder um Containermodule noch um untergeordnete Module.
Containermodule und untergeordnete Module werden durch ICorDebugModule-Oberflächenobjekte dargestellt. Allerdings ist das Verhalten der Benutzeroberfläche im jeweiligen Fall unterschiedlich. Siehe auch <x-ref to section>.
Module und Assemblys
Assemblys mit mehreren Modulen werden nicht bei Zusammenführungen nicht unterstützt, somit stehen ein Modul und eine Assembly im Verhältnis 1:1. Zu jedem ICorDebugModule -Objekt gibt es ein entsprechendes ICorDebugAssembly-Objekt, unabhängig davon, ob es ein Container-Modul oder ein untergeordnetes Modul darstellt. Mit der Methode ICorDebugModule:: GetAssembly lässt sich ein Modul in eine Assembly konvertieren. Zum Zuordnen in die andere Richtung enumeriert die ICorDebugAssembly::EnumerateModules-Methode nur ein Modul. Da Assembly und Modul in diesem Fall eng miteinander verknüpft sind, sind die Begriffe Assembly und Modul weitgehend austauschbar.
Verhaltensunterschiede
Container-Module weisen folgende Verhaltensweisen und Merkmale auf:
Die Metadaten sind für alle enthaltenen untergeordneten Module zusammengeführt.
Ihre Typennamen können geändert werden.
Die ICorDebugModule::GetName-Methode gibt den Pfad zu einem Modul auf dem Datenträger zurück.
Die ICorDebugModule::GetSize-Methode gibt die Größe dieses Images zurück.
Mit der ICorDebugAssembly3.EnumerateContainedAssemblies-Methode werden die untergeordneten Module aufgeführt.
Mit der ICorDebugAssembly3.GetContainerAssembly-Methode wird
S_FALSE
ausgegeben.
Untergeordnete Container-Module weisen folgende Verhaltensweisen und Merkmale auf:
Sie verfügen über einen reduzierten Satz von Metadaten, der sich nur auf die ursprünglich zugsammengeführte Assembly bezieht.
Die Metadatennamen werden nicht geändert.
Die Metadatentoken entsprechen wahrscheinlich nicht den Token in der ursprünglichen Baugruppe vor dem Merge im Erstellungsprozess.
Die ICorDebugModule::GetName-Methode gibt den Assemblynamen und keinen Dateipfad zurück.
Die ICorDebugModule::GetSize-Methode gibt die Größe des ursprünglichen, nicht zusammengeführten Image zurück.
Mit der ICorDebugAssembly3.GetContainerAssemblies-Methode wird
S_FALSE
ausgegeben.Die ICorDebugAssembly3.GetContainerAssembly-Methode gibt das enthaltende Modul aus.
Aus Modulen abgerufene Schnittstellen
Es können verschiedene Schnittstellen erstellt oder aus Modulen abgerufen werden. Dazu zählen:
Ein ICorDebugClass -Objekt, das durch die ICorDebugModule::GetClassFromToken-Methode zurückgegeben wird.
Ein ICorDebugAssembly-Objekt, das durch die ICorDebugModule::GetAssembly-Methode zurückgegeben wird.
Diese Objekte werden immer von ICorDebug zwischengespeichert und weisen die gleiche Zeigeridentität auf, unabhängig davon, ob sie erstellt oder aus dem Containermodul oder einem untergeordneten Modul abgefragt wurden. Das untergeordnete Modul bietet eine gefilterte Ansicht dieser zwischengespeicherten Objekte, jedoch keinen separaten Cache mit eigenen Kopien.
Teilen virtueller Module und nicht verwalteter Debug-APIs
In der folgende Tabelle wird gezeigt, wie sich das Teilen virtueller Module auf das Verhalten anderer Methoden in der nicht verwalteten Debug-API auswirkt.
Methode | enableSplitting = true |
enableSplitting = false |
---|---|---|
ICorDebugFunction::GetModule | Gibt das untergeordnete Modul aus, in dem diese Funktion ursprünglich definiert wurde | Gibt das Containermodul zurück, mit dem diese Funktion zusammengeführt wurde |
ICorDebugClass::GetModule | Gibt das untergeordnete Modul aus, in dem diese Klasse ursprünglich definiert wurde. | Gibt das Containermodul aus, mit dem diese Klasse zusammengeführt wurde. |
ICorDebugModuleDebugEvent::GetModule | Gibt das Containermodul aus, das geladen wurde. Untergeordnete Module erhalten unabhängig von dieser Einstellung keine Ladeereignisse. | Gibt das Containermodul aus, das geladen wurde. |
ICorDebugAppDomain::EnumerateAssemblies | Gibt eine Liste aller untergeordneten und regulären Assemblys aus; Container-Assemblys sind nicht enthalten. Hinweis: Damit die untergeordneten Assemblys aufgeführt werden, dürfen in keiner Container-Assembly Symbole fehlen. Wenn in einer regulären Baugruppe Symbole fehlen, kann die Auflistung u.U. erfolgen. | Gibt eine Liste der Container-Assemblys und regulären Assemblys aus; untergeordnete Assemblys sind nicht enthalten. Hinweis: Wenn in einer regulären Baugruppe Symbole fehlen, kann die Auflistung u.U. erfolgen. |
ICorDebugCode::GetCode (nur beim Verweisen auf IL-Code) | Gibt die IL aus, die in einem Assemblybild vor dem Merge gültig wäre. Insbesondere werden Inline-Metadatentoken korrekt zu TypeRef-Token oder MemberRef-Token, wenn die Typen, auf die verwiesen wird, nicht im virtuellen Modul definiert werden, das den IL-Code enthält. Diese TypeRef-Token oder MemberRef-Token können im IMetaDataImport-Objekt zum entsprechenden virtuellen ICorDebugModule-Objekt nachgesehen werden. | Gibt die IL im Assemblybild nach der Zusammenführung aus. |
Anforderungen
Plattformen: Informationen finden Sie unter Systemanforderungen.
Header: CorDebug.idl, CorDebug.h
Bibliothek: CorGuids.lib
.NET Framework-Versionen: seit Version 4.6 verfügbar, nur .NET Native