我正在编写这个库,它通过媒体基础框架在 C++/CLI 中实现一些基本的音频播放器功能,这些功能将由托管代码使用。我可以播放音频、停止、暂停等。对于不熟悉媒体基础的任何人,媒体 session 都会发布您可以处理的通知事件。这是通过使用 IMFAsyncCallback 对象在 session 对象上调用 BeginGetEvent 来完成的。 IMFAsyncCallback 定义了您应该实现以处理事件的方法 Invoke(IMFAsyncResult)。当事件发生时,工作线程上的 session 对象调用 invoke 方法,您可以使用 IMFAsyncResult 对象查询事件信息。此结果对象由事件线程创建和拥有。
在我的 Invoke 实现中,每当我尝试对我传递的 IMFAsyncResult 对象执行任何操作(包括调用 QueryInterface 或其他操作)时,我都会收到 System.AccessViolationException。我实现 IMFAsyncCallback 的对象是分配在 CRT 堆上的基本 C++ 类(非托管),事件发布在 session 对象拥有的线程上,该线程也分配在 CRT 堆上。
什么可能导致此异常?
为什么我会从使用普通旧 C++ 实现的代码中抛出 .NET 托管异常?当你有一个混合模式程序集时,会发生这种情况吗?
最佳答案
Capture a crash dump ,然后加载到VS 2010或WinDbg中进行分析,全部显示出来。 VS 2010 会更容易,但 WinDbg 可能更有效。
由于使用 WinDbg 是更复杂的选项,我将对此进行详细说明(根据您的目标平台选择以下 32 位或 64 位版本):
.sympath srv*<SymbolCacheDir>*http://msdl.microsoft.com/download/symbols
.sympath+ <PrivatePdbDir>
.loadby sos mscorwks; * fw 2-3.5
或
.loadby sos clr; * fw 4
.load <Sosex32or64Dir>\sosex
!analyze -v
!mk
这很可能会回答您的问题。
https://stackoverflow.com/questions/3652380/