ICorDebugProcess6::EnableVirtualModuleSplitting 方法

啟用或停用虛擬模組分割。

語法

HRESULT EnableVirtualModuleSplitting(  
   BOOL enableSplitting  
);  

參數

enableSplitting
若要啟用虛擬模組分割,則為 true;若要停用,則為 false

備註

虛擬模組分割可讓 ICorDebug 辨認在建置流程期間合併在一起的模組,並以一組不同的模組 (而不是以單一大型模組) 來呈現。 執行這項操作會變更下述各種 ICorDebug 方法的行為。

注意

這個方法僅適用於 .NET Native。

您可以呼叫這個方法並隨時變更 enableSplitting 的值。 這項操作不會造成 ICorDebug 物件中任何具狀態的功能變更,而是會在呼叫方法時,更改虛擬模組分割和未受管理的偵錯 API 一節中所列的方法行為。 呼叫這些方法時,使用虛擬模組確實會對效能帶來負面影響。 此外,您可能需要在記憶體內部快取大量虛擬化中繼資料,才能正確實作 IMetaDataImport API,而且這些快取即使在關閉虛擬模組分割之後仍可能保留。

詞彙

描述虛擬模組分割時會使用下列詞彙:

容器模組或容器
彙總模組。

子模組或虛擬模組
在容器中找到的模組。

一般模組
建置時間未合併的模組。 這些模組不是容器模組,就是子模組。

容器模組和子模組都會以 ICorDebugModule 介面物件來代表。 不過,介面行為在每種情況下都稍有不同,如 <x-ref to section> 一節所述。

模組和組件

組件合併案例不支援多模組組件,因此模組和組件之間有一對一關聯性。 每個 ICorDebugModule 物件不論代表容器模組或子模組,都有對應的 ICorDebugAssembly 物件。 ICorDebugModule::GetAssembly 方法會將模組轉換成組件。 若要反向對應,ICorDebugAssembly::EnumerateModules 方法只會列舉 1 個模組。 由於組件和模組在此情況下會形成緊密結合的配對,因此組件和模組兩個詞彙的互換情況會更高。

行為差異

容器模組具有下列行為和特性:

  • 所有構成子模組的中繼資料會合併在一起。

  • 其類型名稱可能會受損。

  • ICorDebugModule::GetName 方法會傳回磁碟上模組的路徑。

  • ICorDebugModule::GetSize 方法會傳回該映像的大小。

  • ICorDebugAssembly3.EnumerateContainedAssemblies 方法會列出子模組。

  • ICorDebugAssembly3.GetContainerAssembly 方法會傳回 S_FALSE

子模組具有下列行為和特性:

  • 子模組包含一組縮減的中繼資料,只對應至已合併的原始組件。

  • 中繼資料名稱不會受損。

  • 中繼資料語彙基元不太可能符合原始組件在建置流程中合併前的語彙基元。

  • ICorDebugModule::GetName 方法會傳回組件名稱,而不是檔案路徑。

  • ICorDebugModule::GetSize 方法會傳回原始未合併的映像大小。

  • ICorDebugModule3.EnumerateContainedAssemblies 方法會傳回 S_FALSE

  • ICorDebugAssembly3.GetContainerAssembly 方法會傳回所包含的模組。

從模組擷取的介面

可從模組建立或擷取的各種介面。 其中包含:

這些物件一律會由 ICorDebug 快取,並且不論是從容器模組或子模組建立或查詢,都不會有相同的指標識別。 子模組提供這些快取物件的篩選檢視,而不是其本身複本的個別快取。

虛擬模組分割和未受管理的偵錯 API

下表顯示虛擬模組分割如何影響未受管理之偵錯 API 中其他方法的行為。

方法 enableSplitting = true enableSplitting = false
ICorDebugFunction::GetModule 傳回這個函式原本定義所在的子模組 傳回已合併這個函式的目標容器模組
ICorDebugClass::GetModule 傳回這個類別原本定義所在的子模組 傳回已合併這個類別的目標容器模組。
ICorDebugModuleDebugEvent::GetModule 傳回已載入的容器模組。 不論這個設定為何,都不會提供載入事件給子模組。 傳回已載入的容器模組。
ICorDebugAppDomain::EnumerateAssemblies 傳回子組件和一般組件的清單,不包含任何容器組件。 注意:如有任何容器組件遺漏符號,則不會列舉其子組件。 如有任何一般組件遺漏符號,則列舉或不列舉都有可能。 傳回容器組件和一般組件的清單,不包含任何子組件。 注意:如有任何一般組件遺漏符號,則列舉或不列舉都有可能。
ICorDebugCode::GetCode (僅限指涉 IL 程式碼時) 傳回在預先合併組件映像中有效的 IL。 具體來說,當所參考的類型未在包含 IL 的虛擬模組中定義時,所有內嵌中繼資料語彙基元都會是正確的 TypeRef 或 MemberRef 語彙基元。 您可以在 IMetaDataImport 物件中查閱這些 TypeRef 或 MemberRef 語彙基元,以尋找對應的虛擬 ICorDebugModule 物件。 傳回合併後組件映像中的 IL。

規格需求

平台:請參閱系統需求

標頭:CorDebug.idl、CorDebug.h

程式庫:CorGuids.lib

.NET Framework版本:自 4.6 起提供,.NET Native

另請參閱