我正在編寫這個庫,它通過託管代碼將使用的Media Foundation框架在C++/CLI中實現一些基本的音頻播放器功能。我可以播放音頻,停止,暫停等等。對於任何不熟悉媒體基礎的人員,媒體會話都會發布可處理通知的事件。這是通過使用IMFAsyncCallback對象在會話對象上調用BeginGetEvent來完成的。 IMFAsyncCallback定義了您應該實現以處理事件的方法Invoke(IMFAsyncResult)。當事件發生時,invoke方法由具有可以查詢事件信息的IMFAsyncResult對象的工作線程上的會話對象調用。此結果對象由事件線程創建並擁有。來自非託管代碼的System.AccessViolationException?
在我的Invoke實現中,每當我嘗試使用傳遞的IMFAsyncResult對象進行任何操作(包括調用QueryInterface或其他)時,我都會遇到System.AccessViolationException。我已經實現IMFAsyncCallback的對象是在CRT堆上分配的基本C++類(不是託管的),並且事件發佈在CRT堆上也分配的會話對象擁有的線程上。
什麼可能導致此異常?
爲什麼我會從通過普通舊C++實現的代碼中拋出.NET託管異常?這只是當你有混合模式組件時會發生什麼?