ここでは、共通言語ランタイム (CLR: Common Language Runtime) のデバッグ API を使用するときに考慮する必要のある、.NET Framework Version 2.0 での変更点について説明します。
API の変更点
CorDebug はコクラスではなくなりました。 共同作成する代わりに、ホスト API の CreateDebuggingInterfaceFromVersion グローバル静的関数を使用します。 デバッガーのバージョンは、CorDebug.idl の CorDebugInterfaceVersion 列挙型で定義されている定数の 1 つでなければなりません。 デバッガーが .NET Framework 2.0 をサポートする場合は、CorDebugVersion_2_0 定数を使用します。 実行中のプロセスのデバッグ対象バージョンを取得するには、ホスト API の GetVersionFromProcess グローバル静的関数を使用します。 または、ホスト API の GetRequestedRuntimeVersion グローバル静的関数を使用して、ディスク上の特定の .exe ファイルに対して読み込まれるバージョンの最善の予測を取得したり、ランタイムのバージョンをユーザーに選択させたりすることもできます。 ユーザーが指定した文字列が有効なバージョンかどうかを判定するには、ホスト API の GetRequestedRuntimeInfo グローバル静的関数を使用します。 これらの関数はすべて、MSCorEE.idl で定義されています。
.NET Framework 2.0 対応のデバッガーとして認識されるためには、デバッガーは ICorDebugManagedCallback2 インターフェイスを実装する必要があります。
.NET Framework 2.0 での ICorDebugEnum の戻り値は、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 を使用します。
ICorDebugFunction::GetNativeCode の代わりに、ICorDebugFunction2::EnumerateNativeCode を使用します。