启用或禁用虚拟模块拆分。
Syntax
HRESULT EnableVirtualModuleSplitting(
BOOL enableSplitting
);
参数
enableSplitting
true 启用虚拟模块拆分; false 若要禁用它,则为
注解
虚拟模块拆分会导致 ICorDebug 识别在生成过程中合并在一起的模块,并将其呈现为一组单独的模块,而不是单个大型模块。 执行此作将更改下面所述的各种 ICorDebug 方法的行为。
注释
此方法仅适用于 .NET Native。
可以调用此方法,并且可以随时更改其 enableSplitting 值。 它不会导致 ICorDebug 对象中的任何有状态功能更改,而不是在调用 虚拟模块拆分和非托管调试 API 部分中列出的方法的行为。 调用这些方法时,使用虚拟模块会产生性能损失。 此外,可能需要大量内存中缓存虚拟化元数据才能正确实现 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 方法返回包含的模块。
从模块检索的接口
可以从模块创建或检索各种接口。 其中包括:
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 起可用