Udostępnij za pośrednictwem


Metoda ICorDebugProcess6::EnableVirtualModuleSplitting

Włącza lub wyłącza dzielenie modułów wirtualnych.

Składnia

HRESULT EnableVirtualModuleSplitting(
   BOOL enableSplitting
);

Parametry

enableSplittingtrue 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:

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

Zobacz też