共用方式為


ICorDebugProcess6::EnableVirtualModuleSplitting 方法

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

語法

HRESULT EnableVirtualModuleSplitting(
   BOOL enableSplitting
);

參數

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

備註

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

注意

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

您可以呼叫這個方法並隨時變更 enableSplitting 的值。 它不會在 ICorDebug 物件中造成任何具狀態的功能變更,除了變更虛擬模組分割和未受管理的偵錯 API 區段所列出的方法行為外,它們呼叫時也不會產生任何可設定狀態的功能變更。 呼叫這些方法時,使用虛擬模組確實會對效能帶來負面影響。 此外,可能需要大量記憶體內部快取虛擬化元數據,才能正確實 作 IMetaDataImport API,而且即使虛擬模組分割關閉之後,仍可保留這些快取。

詞彙

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

容器模組或容器 匯總模組。

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

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

容器模組和子模組都是由 ICorDebugModule 介面物件表示。 不過,介面的行為在每個案例中稍有不同,如區段所描述的 <x-ref to 區段> 所述。

模組和組件

組件合併案例不支援多模組組件,因此模組和組件之間有一對一關聯性。 不論其是否代表容器模組或子模組,每個 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。

需求

平台:請參閱系統需求

標頭:CorDebug.idl、CorDebug.h

程式庫:CorGuids.lib

.NET Framework 版本: 僅適用於 4.6、.NET Native

另請參閱