Изменения API отладки в платформе .NET Framework 2.0
В этом разделе объясняются изменения в платформе .NET Framework версии 2.0, которые необходимо учитывать при использовании API отладки среды CLR.
Изменения API
CorDebug больше не является компонентным классом. Вместо компонентного создания этого объекта следует воспользоваться функцией глобальной статистики CreateDebuggingInterfaceFromVersion в API размещения. Версией отладчика должна быть одна из констант для перечисления CorDebugInterfaceVersion в CorDebug.idl. (Если отладчик поддерживает платформу .NET Framework 2.0, используйте константу CorDebugVersion_2_0.) Чтобы получить номер версии отлаживаемого объекта для запущенного процесса, используйте глобальную статическую функцию GetVersionFromProcess в API размещения. Кроме того, с помощью глобальной агрегатной функции GetRequestedRuntimeVersion в API размещения можно получить наилучшую гипотезу относительно версии, которая будет загружена для данного EXE-файла на диске, либо предоставить возможность пользователю выбрать версию среды выполнения. (С помощью глобальной агрегатной функции GetRequestedRuntimeInfo в API размещения можно определить, является ли предоставленная пользователем строка допустимым номером версии.) Все эти функции определены в MSCorEE.idl.
Отладчик должен реализовать интерфейс ICorDebugManagedCallback2, чтобы в нем можно было распознать отладчик, поддерживающий платформу .NET Framework 2.0.
Возвращаемые интерфейсом ICorDebugEnum значения в платформе .NET Framework 2.0 являются COM-совместимыми.
В трассировках стека, в которые среда выполнения вставила особый кадр для выполнения определенной задачи, может появиться новый объект ICorDebugInternalFrame. Эти кадры не будут отвечать на запросы QueryInterface интерфейса ICorDebugNativeFrame или ICorDebugILFrame.
Время ожидания метода ICorDebugController::Stop игнорируется.
Метод ICorDebugModule::EnableJITDebugging можно использовать только при первой загрузке метода. Если этот метод используется в обратном вызове ModuleLoad, осуществляемом в рамках операции attach, при его выполнении произойдет сбой. (Это ограничение гарантирует согласованность кода для всех функций в модуле.)
Машинный код для данной функции в платформе .NET Framework не обязательно находится в одном непрерывном блоке памяти. Вследствие этого отладчики больше не должны использовать методы GetAddress, GetSize и GetCode интерфейса ICorDebugCode. Вместо них следует использовать методы 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, поддерживающих универсальные шаблоны.
Использовать метод ICorDebugType::GetStaticFieldValue вместо его аналога в интерфейсе ICorDebugClass.
Использовать методы ICorDebugEval2::CallParameterizedFunction, ICorDebugEval2::NewParameterizedObject, ICorDebugEval2::NewParameterizedObjectNoConstructor, ICorDebugEval2::NewParameterizedArray и ICorDebugEval2::CreateValueForType вместо их аналогов в интерфейсе ICorDebugEval.
Использовать метод ICorDebugFunction2::EnumerateNativeCode вместо методаICorDebugFunction::GetNativeCode.
См. также
Основные понятия
Общие сведения об отладке среды CLR