ICorDebugProcess6::EnableVirtualModuleSplitting 方法

启用或禁用虚拟模块拆分。

语法

HRESULT EnableVirtualModuleSplitting(  
   BOOL enableSplitting  
);  

参数

enableSplitting
true 来启用虚拟模块拆分;false 来将其禁用。

备注

虚拟模块拆分会导致 ICorDebug 识别生成过程中合并在一起的模块,并将它们呈现为一组单独的模块而非一个单独的大模块。 这样做会更改下述各种 ICorDebug 方法的行为。

备注

此方法仅适用于 .NET Native。

可随时调用方法并更改 enableSplitting 值。 它不会导致 ICorDebug 对象中发生任何状态功能更改,只会在经调用时更改虚拟模块拆分和未托管调试 API 部分列出的方法行为。 调用那些方法时,使用虚拟模块确实会导致性能显著下降。 此外,可能需要对虚拟化元数据进行大量内存中缓存才能正确实现 IMetaDataImport API,并且即使在关闭虚拟模块拆分后,这些缓存也可能保留。

术语

描述虚拟模块拆分时会用到下列术语:

容器模块,即容器
聚合模块。

子模块,即虚拟模块
在容器中发现的各模块。

普通模块
未在生成过程中合并的模块。 它们既不是容器模块也不是子模块。

但 ICor调试模块接口对象会表示容器模块和子模块。 然而,每种情况下的接口行为稍有不同,如 <x-ref to section> 部分所述。

模块和程序集

在程序集合并的情况下,多模块程序集不受支持,因此模块和程序集之间存在一对一的关系。 每个 ICor调试模块对象(不论其代表容器模块还是子模块)都拥有相应的 ICor调试程序集对象。 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

请参阅