共用方式為


ICorDebugProcess6::EnableVirtualModuleSplitting 方法

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

語法

HRESULT EnableVirtualModuleSplitting(
   BOOL enableSplitting
);

參數

enableSplitting true 啟用虛擬模組分割; false 停用它。

備註

虛擬模組分割會導致 ICorDebug 辨識在建置程式期間合併在一起的模組,並將其呈現為一組個別模組,而不是單一大型模組。 這樣做會變更下列所述各種 ICorDebug 方法的行為。

備註

此方法僅適用於 .NET 原生。

可以呼叫這個方法,並且可以隨時更改的 enableSplitting 值。 除了在呼叫虛擬模組分割和非受控偵錯 API 區段中列出的方法行為之外,它不會在 ICorDebug 物件中造成任何具狀態功能變更。 使用虛擬模組在呼叫這些方法時確實會產生效能損失。 此外,可能需要虛擬化中繼資料的重要記憶體內快取,才能正確實作 IMetaDataImport API,而且即使在關閉虛擬模組分割之後,這些快取仍可能會保留。

術語

描述虛擬模組分割時會使用下列術語:

容器模組,或容器聚合模組。

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

常規模組 建置時未合併的模組。 它們既不是容器模組,也不是子模組。

容器模組與子模組皆以 ICorDebugModule 介面物件表示。 然而,介面的行為在每種情況下略有不同。

模組和組件

組件合併案例不支援多模組組件,因此模組與組件之間存在一對一關係。 每個 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 權杖。 這些 TypeRef 或 MemberRef 標記可以在對應虛擬ICorDebugModule物件的 IMetaDataImport 物件中查詢。 傳回合併後元件映射中的 IL。

需求

平台: 請參閱 .NET 支援的作業系統

標題: CorDebug.idl、CorDebug.h

圖書館: CorGuids.lib

.NET 版本: 從 .NET Framework 4.6 開始提供

另請參閱