探查器兼容性设置
默认情况下,在 .NET Framework 4中,公共语言运行时 (CLR) 仅加载和使用针对 .NET Framework 4 生成的探查器。 除非明确指定,否则 CLR 不加载或运行已为 .NET Framework 2.0、3.0 或 3.5 版本构建的探查器。(在本主题中,术语“2.0 版探查器”是指为 .NET Framework 2.0、3.0 和 3.5 版本构建的探查器。)
探查器用户必须通过使用 COMPLUS_ProfAPI_ProfilerCompatibilitySetting 环境变量来明确选择使用 2.0 版探查器。 .NET Framework 4 中使用的 2.0 版探查器按如下方式运行:
.NET Framework 2.0 版分析 API 仍可按照 2.0 版文档中所述的方式在 .NET Framework 4 中正常工作。
.NET Framework 4 中不会对未记录的 2.0 版分析 API 或 CLR 行为予以保证。 不能保证依赖于未记录的行为的 2.0 版探查器可在 .NET Framework 4 中正常工作。请注意,此兼容性设置不提供与 CLR 2.0 行为的向后兼容。
COMPLUS_ProfAPI_ProfilerCompatibilitySetting
在设置 COMPLUS_ProfAPI_ProfilerCompatibilitySetting 环境变量之前,必须设置 COR_PROFILER 或 COR_ENABLE_PROFILING 环境变量。 (有关说明,请参见设置分析环境。)
可以将 COMPLUS_ProfAPI_ProfilerCompatibilitySetting 环境变量设置为下表所示的三个值之一。
备注
在 .NET Framework 版本 3.5 和更低版本中,CLR 不支持 COMPLUS_ProfAPI_ProfilerCompatibilitySetting 变量。如果已设置 COR_PROFILER 或 COR_ENABLE_PROFILING 环境变量,则 CLR 始终会尝试加载探查器。
设置 |
CLR 行为 |
---|---|
EnableV2Profiler |
加载和激活 2.0 版探查器。 |
DisableV2Profiler |
禁用 2.0 版探查器,但不卸载它们。 .NET Framework 4 探查器不会受到影响。 此设置为默认设置。 |
PreventLoad |
无论为其编写探查器的 .NET Framework 的版本如何,都不会加载任何探查器。 |
详细的行为如下:
EnableV2Profiler
无论为其编写探查器的 .NET Framework 的版本如何,.NET Framework 4 CLR 都会加载并使用可用的探查器。 在进程内并行分析中,如果 .NET Framework 版本 2.0 CLR 首先在进程中加载一个探查器,则 .NET Framework 4 CLR 不会重新加载该 2.0 版探查器。
DisableV2Profiler(默认值)
.NET Framework 4 CLR 加载探查器,并通过调用探查器的 IUnknown::QueryInterface 方法查找 ICorProfilerCallback3 接口来确定探查器的版本。
如果探查器实现 ICorProfilerCallback3,则探查器为 .NET Framework 版本 4 探查器,并且 CLR 将继续使用它。
如果探查器未实现 ICorProfilerCallback3,则探查器为 2.0 版探查器。 在此情况下,CLR 会释放探查器接口,且不会激活探查器。 不过,由于 CLR 未卸载探查器 DLL,因此它可以保持与未卸载探查器 DLL 的 .NET Framework 版本 2.0 CLR 的向后兼容性。 (请注意,.NET Framework 4 探查器在分离或关闭时确实会被卸载,因此,若要修改 .NET Framework 4 的探查器,则必须更改此行为。)
PreventLoad
.NET Framework 4 CLR 完全忽略探查器。 此设置对于某些进程内并行方案很有用。 有关更多信息,请参见进程内并行分析。
例如,若要指示 CLR 加载 .NET Framework 2.0 探查器,请打开命令提示符窗口并键入以下内容:
set COMPLUS_ProfAPI_ProfilerCompatibilitySetting=EnableV2Profiler
备注
此兼容性开关只会影响探查器启动路径。对于附加-加载探查器,运行时对 ICorProfilerCallback3 接口调用 IUnknown::QueryInterface 函数。如果探查器未实现此接口(此情况适用于 2.0 版探查器),则运行时不会加载探查器,并会在事件日志中记录探查器加载失败项。