启用或禁用虚拟模块拆分。
Syntax
HRESULT EnableVirtualModuleSplitting(
   BOOL enableSplitting
);
参数
              enableSplitting
              true 启用虚拟模块拆分; 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 方法返回包含的模块。 
从模块检索的接口
可以从模块创建或检索各种接口。 其中包括:
- ICorDebugClass 对象,由 ICorDebugModule::GetClassFromToken 方法返回。 
- ICorDebugAssembly 对象,由 ICorDebugModule::GetAssembly 方法返回。 
这些对象始终由 ICorDebug 缓存,无论它们是从容器模块还是子模块创建或查询它们,它们都将具有相同的指针标识。 子模块提供这些缓存对象的筛选视图,而不是具有其自己的副本的单独缓存。
虚拟模块拆分和非托管调试 API
下表显示了虚拟模块拆分如何影响非托管调试 API 中其他方法的行为。
| 方法 | enableSplitting=true | enableSplitting=false | 
|---|---|---|
| ICorDebugFunction::GetModule | 返回此函数最初在 | 返回此函数合并到的容器模块 | 
| ICorDebugClass::GetModule | 返回最初定义此类的子模块。 | 返回此类合并到的容器模块。 | 
| ICorDebugModuleDebugEvent::GetModule | 返回已加载的容器模块。 无论此设置如何,子模块都不会提供负载事件。 | 返回已加载的容器模块。 | 
| ICorDebugAppDomain::EnumerateAssemblies | 返回子程序集和常规程序集的列表;不包含任何容器程序集。 注意: 如果任何容器程序集缺少符号,则不会枚举其子程序集。 如果任何常规程序集缺少符号,则它可以枚举或可能未枚举。 | 返回容器程序集和常规程序集的列表;不包含任何子程序集。 注意: 如果任何常规程序集缺少符号,则它可以枚举或可能未枚举。 | 
| ICorDebugCode::GetCode (仅引用 IL 代码时) | 返回在预合并程序集映像中有效的 IL。 具体而言,当引用的类型未在包含 IL 的虚拟模块中定义时,任何内联元数据令牌都将正确为 TypeRef 或 MemberRef 标记。 可以在 IMetaDataImport 对象中查找相应的虚拟 ICorDebugModule 对象中的这些 TypeRef 或 MemberRef 令牌。 | 返回合并后程序集映像中的 IL。 | 
要求
平台: 请参阅 .NET 支持的作系统。
页眉: CorDebug.idl、CorDebug.h
图书馆: CorGuids.lib
.NET 版本: 自 .NET Framework 4.6 起可用