Metoda ICorDebugProcess6::EnableVirtualModuleSplitting
Włącza lub wyłącza dzielenie modułów wirtualnych.
Składnia
HRESULT EnableVirtualModuleSplitting(
BOOL enableSplitting
);
Parametry
enableSplitting
true
aby włączyć dzielenie modułu wirtualnego; false
aby go wyłączyć.
Uwagi
Dzielenie modułów wirtualnych powoduje , że funkcja ICorDebug rozpoznaje moduły, które zostały scalone razem podczas procesu kompilacji, i przedstawia je jako grupę oddzielnych modułów, a nie pojedynczego dużego modułu. Spowoduje to zmianę zachowania różnych metod ICorDebug opisanych poniżej.
Uwaga
Ta metoda jest dostępna tylko w przypadku platformy .NET Native.
Tę metodę można wywołać, a wartość enableSplitting
można zmienić w dowolnym momencie. Nie powoduje to żadnych stanowych zmian funkcjonalnych w obiekcie ICorDebug , poza zmianą zachowania metod wymienionych w podziale modułu wirtualnego i niezarządzanych interfejsów API debugowania w momencie ich wywołania. Użycie modułów wirtualnych powoduje karę za wydajność podczas wywoływania tych metod. Ponadto do poprawnego zaimplementowania interfejsów API IMetaDataImport może być wymagane znaczne buforowanie w pamięci metadanych zwirtualizowanych, a te pamięci podręczne mogą być zachowywane nawet po wyłączeniu podziału modułu wirtualnego.
Terminologia
Podczas opisywania podziału modułu wirtualnego są używane następujące terminy:
moduły kontenerów lub kontenery Moduły agregacji.
moduły podrzędne lub moduły wirtualne Moduły znalezione w kontenerze.
moduły zwykłe, które nie zostały scalone w czasie kompilacji. Nie są to ani moduły kontenera, ani moduły podrzędne.
Oba moduły kontenerów i moduły podrzędne są reprezentowane przez obiekty interfejsu ICorDebugModule. Jednak zachowanie interfejsu jest nieco inne w każdym przypadku, jak <opisano w sekcji x-ref do sekcji> .
Moduły i zestawy
Zestawy wielo module nie są obsługiwane w scenariuszach scalania zestawów, dlatego istnieje relacja jeden do jednego między modułem a zestawem. Każdy obiekt ICorDebugModule, niezależnie od tego, czy reprezentuje moduł kontenera, czy pod module, ma odpowiedni obiekt ICorDebugAssembly. Metoda ICorDebugModule::GetAssembly konwertuje z modułu na zestaw. Aby zamapować w innym kierunku, metoda ICorDebugAssembly::EnumerateModules wylicza tylko 1 moduł. Ponieważ zestaw i moduł tworzą ściśle połączoną parę w tym przypadku, terminy zestawu i modułu stają się w dużej mierze zamienne.
Różnice behawioralne
Moduły kontenerów mają następujące zachowania i cechy:
Ich metadane dla wszystkich składników podrzędnych są scalane razem.
Ich nazwy typów mogą być mangled.
Metoda ICorDebugModule::GetName zwraca ścieżkę do modułu na dysku.
Metoda ICorDebugModule::GetSize zwraca rozmiar tego obrazu.
Metoda ICorDebugAssembly3.EnumerateContainedAssemblies zawiera listę modułów podrzędnych.
Metoda ICorDebugAssembly3.GetContainerAssembly zwraca wartość
S_FALSE
.
Moduły podrzędne mają następujące zachowania i cechy:
Mają ograniczony zestaw metadanych, który odpowiada tylko oryginalnemu zestawowi, który został scalony.
Nazwy metadanych nie są mangled.
Tokeny metadanych są mało prawdopodobne, aby były zgodne z tokenami w oryginalnym zestawie przed scaleniem ich w procesie kompilacji.
Metoda ICorDebugModule::GetName zwraca nazwę zestawu, a nie ścieżkę pliku.
Metoda ICorDebugModule::GetSize zwraca oryginalny nieergowany rozmiar obrazu.
Metoda ICorDebugModule3.EnumerateContainedAssemblies zwraca wartość
S_FALSE
.Metoda ICorDebugAssembly3.GetContainerAssembly zwraca moduł zawierający.
Interfejsy pobierane z modułów
Różne interfejsy można tworzyć lub pobierać z modułów. Oto niektóre poprawki:
Obiekt ICorDebugClass, który jest zwracany przez metodę ICorDebugModule::GetClassFromToken .
Obiekt ICorDebugAssembly, który jest zwracany przez metodę ICorDebugModule::GetAssembly .
Te obiekty są zawsze buforowane przez funkcję ICorDebug i będą miały taką samą tożsamość wskaźnika, niezależnie od tego, czy zostały utworzone, czy odpytywane z modułu kontenera, czy z modułu podrzędnego. Moduł podrzędny udostępnia filtrowany widok tych buforowanych obiektów, a nie oddzielną pamięć podręczną z własnymi kopiami.
Dzielenie modułu wirtualnego i niezarządzane interfejsy API debugowania
W poniższej tabeli pokazano, jak dzielenie modułów wirtualnych wpływa na zachowanie innych metod w niezarządzanych interfejsach API debugowania.
Method | enableSplitting = true |
enableSplitting = false |
---|---|---|
ICorDebugFunction::GetModule | Zwraca moduł podrzędny, w ramach którego ta funkcja została pierwotnie zdefiniowana | Zwraca moduł kontenera, do którego została scalona ta funkcja |
ICorDebugClass::GetModule | Zwraca moduł podrzędny, w ramach którego ta klasa została pierwotnie zdefiniowana. | Zwraca moduł kontenera, do którego została scalona ta klasa. |
ICorDebugModuleDebugEvent::GetModule | Zwraca załadowany moduł kontenera. Moduły podrzędne nie mają zdarzeń ładowania niezależnie od tego ustawienia. | Zwraca załadowany moduł kontenera. |
ICorDebugAppDomain::EnumerateAssemblies | Zwraca listę zestawów podrzędnych i zestawów regularnych; nie są uwzględniane żadne zestawy kontenerów. Uwaga: jeśli brakuje symboli zestawu kontenerów, żaden z jego podzbięci nie zostanie wyliczony. Jeśli brakuje żadnych zwykłych symboli zestawu, może być wyliczany lub nie. | Zwraca listę zestawów kontenerów i zestawów regularnych; nie są uwzględniane żadne zestawy podrzędne. Uwaga: jeśli brakuje symboli zwykłego zestawu, może być wyliczany lub nie. |
ICorDebugCode::GetCode (tylko podczas odwoływania się do kodu IL) | Zwraca wartość IL, która byłaby prawidłowa w obrazie zestawu wstępnego scalania. W szczególności wszystkie tokeny metadanych wbudowanych będą poprawnie tokenami TypeRef lub MemberRef, gdy typy, do których odwołuje się, nie są zdefiniowane w module wirtualnym zawierającym il. Te tokeny TypeRef lub MemberRef można wyszukać w obiekcie IMetaDataImport dla odpowiedniego wirtualnego obiektu ICorDebugModule. | Zwraca il w obrazie zestawu po scaleniu. |
Wymagania
Platformy: zobacz Wymagania systemowe.
Nagłówek: CorDebug.idl, CorDebug.h
Biblioteka: CorGuids.lib
Wersje programu .NET Framework: dostępne tylko od wersji 4.6, .NET Native