私は、マネージ コードによって消費されるメディア ファンデーション フレームワークを介して C++/CLI でいくつかの基本的なオーディオ プレーヤー機能を実装するこのライブラリを作成しています。オーディオの再生、停止、一時停止などは問題なくできます。Media Foundation に慣れていない人のために説明すると、メディア セッションは、通知用に処理できるイベントを投稿します。これは、セッション オブジェクトで IMFAsyncCallback オブジェクトを使用して BeginGetEvent を呼び出すことによって行われます。IMFAsyncCallback は、イベントを処理するために実装する必要があるメソッド Invoke(IMFAsyncResult) を定義します。イベントが発生すると、invoke メソッドは、イベント情報を照会できる IMFAsyncResult オブジェクトを使用して作業スレッド上のセッション オブジェクトによって呼び出されます。この結果オブジェクトは、イベント スレッドによって作成および所有されます。
私の Invoke の実装では、渡された IMFAsyncResult オブジェクトを使用して何か (QueryInterface の呼び出しなどを含む) を実行しようとすると、System.AccessViolationException が発生します。IMFAsyncCallback を実装したオブジェクトは、CRT ヒープに割り当てられた基本的な C++ クラス (管理されていない) であり、イベントは CRT ヒープに割り当てられたセッション オブジェクトが所有するスレッドに投稿されます。
この例外の原因は何ですか?
従来の C++ で実装されたコードから .NET マネージ例外がスローされるのはなぜですか? 混合モードのアセンブリを使用すると、まさにそれが起こりますか?