我正在编写这个库,它通过将由托管代码使用的媒体基础框架在 C++/CLI 中实现一些基本的音频播放器功能。我可以很好地播放音频、停止、暂停等。对于不熟悉 Media Foundation 的任何人,媒体会话都会发布您可以处理的通知事件。这是通过使用 IMFAsyncCallback 对象在会话对象上调用 BeginGetEvent 来完成的。IMFAsyncCallback 定义了您应该实施以处理事件的方法 Invoke(IMFAsyncResult)。发生事件时,工作线程上的会话对象会调用调用方法,该对象具有您可以查询事件信息的 IMFAsyncResult 对象。此结果对象由事件线程创建和拥有。
在我的 Invoke 实现中,每当我尝试使用传递的 IMFAsyncResult 对象执行任何操作(包括仅调用 QueryInterface 或其他操作)时,都会收到 System.AccessViolationException。我实现 IMFAsyncCallback 的对象是在 CRT 堆上分配的基本 C++ 类(非托管),事件发布在会话对象拥有的线程上,该线程也分配在 CRT 堆上。
什么可能导致此异常?
为什么我会从用普通旧 C++ 实现的代码中抛出 .NET 托管异常?当你有一个混合模式程序集时会发生这种情况吗?