本主题说明在使用公共语言运行时 (CLR) 调试 API 时应该注意的 .NET Framework 2.0 版中的一些更改。
API 更改
CorDebug 不再是组件类。 请在承载 API 中使用 CreateDebuggingInterfaceFromVersion 全局静态函数,而不是进行协同创建。 调试器版本应该是 CorDebug.idl 内的 CorDebugInterfaceVersion 枚举中的常量之一。 (如果调试器支持 .NET Framework 2.0,请使用 CorDebugVersion_2_0 常量。)请在承载 API 中使用 GetVersionFromProcess 全局静态函数来获取正在运行的进程的调试对象版本。 或者可以在承载 API 中使用 GetRequestedRuntimeVersion 全局静态函数,以便最准确地推测出将为磁盘上的给定 .exe 文件加载的版本,或者请用户挑选运行时版本。 (您可以在承载 API 中使用 GetRequestedRuntimeInfo 全局静态函数,以确定用户提供的字符串是否为有效版本)。所有这些函数均在 MSCorEE.idl 中定义。
调试器必须实现 ICorDebugManagedCallback2 接口以便被识别为支持 .NET Framework 2.0 的调试器。
ICorDebugEnum 的返回值在 .NET Framework 2.0 中符合 COM 标准。
新 ICorDebugInternalFrame 对象可能会出现在堆栈跟踪中,运行时在堆栈跟踪中插入了特殊帧以完成某个任务。 这些框将不会响应 ICorDebugNativeFrame 或 ICorDebugILFrame 接口的 QueryInterface 查询。
ICorDebugController::Stop 方法超时被忽略。
只有首先加载模块,然后才可以使用 ICorDebugModule::EnableJITDebugging 方法。 如果此方法用于在 attach 操作过程中发出的 ModuleLoad 回调,则它将失败。 (此限制可以确保模块对于其所有函数都具有一致的代码。)
.NET Framework 中给定函数的本机代码可能不在一个连续的内存块中。 因此,调试器不应该再使用 ICorDebugCode 接口的 GetAddress, GetSize 和 GetCode 方法。 而是应该使用 ICorDebugCode2::GetCodeChunks 和 ICorDebugProcess::ReadMemory。
混合模式的调试器必须使用新的 ICorDebugProcess2::SetUnmanagedBreakpoint 方法来设置非托管的断点。
本机线程退出调试事件在 .NET Framework 2.0 带外。
调试 API 中的对象将会更加严重地失效。 在 .NET Framework 1.0 或 1.1 中成功的操作如果在 .NET Framework 2.0 中返回 CORDBG_E_OBJECT_NEUTERED,则执行此操作的接口已经超出了其生存期并且应该被重新获得。 在 .NET Framework 1.0 和 1.1 中通过操作获得的值可能一直都不正确。
泛型
在 .NET Framework 2.0 中引入的泛型否定了调试器在早期版本中做出的许多假设。 调试器应该转变为使用以下识别泛型形式的 ICorDebug 函数:
请在 ICorDebugClass 接口中使用 ICorDebugType::GetStaticFieldValue,而不是使用其对应项。
请在 ICorDebugEval 接口中使用 ICorDebugEval2::CallParameterizedFunction、ICorDebugEval2::NewParameterizedObject、ICorDebugEval2::NewParameterizedObjectNoConstructor、ICorDebugEval2::NewParameterizedArray 和 ICorDebugEval2::CreateValueForType,而不是使用它们的对应项。
使用 ICorDebugFunction2::EnumerateNativeCode,而不是使用 ICorDebugFunction::GetNativeCode。