System.AccessVioLationException来自非管理代码?
-
01-10-2019 - |
题
我正在编写此库,该库通过媒体基础框架在C ++/CLI中实现了一些基本的音频播放器功能,这些框将被托管代码消费。我可以播放音频,停止,暂停等。对于任何不熟悉媒体基金会的人,媒体会议发布了您可以进行通知的事件。这是通过使用iMfasynccallback对象在会话对象上调用begingetevent来完成的。 Imfasynccallback定义了您应该实现的方法来处理事件的方法(iMfasyncresult)。发生事件时,将在带有iMfasyncresult对象的工作线程上的会话对象调用调用方法,您可以查询事件信息。此结果对象由事件线程创建和拥有。
在我实施Invoke时,每当我尝试使用我被传递的iMfasyncresult对象进行任何操作(包括调用QueryInterface之类的东西)时,我都会获得System.AccessVioLationException。我实现的对象IMFASYNCCALLBACK是在CRT堆上分配的基本C ++类(未管理),事件发布在CRT Heap上的会话对象拥有的线程上。
什么可能导致这个例外?
为什么我会从普通旧C ++实现的代码中获得.NET托管的异常?那是当您具有混合模式组件时会发生什么?
解决方案
捕获崩溃转储, ,然后将其加载到VS 2010或WINDBG中进行分析,并应显示所有内容。 VS 2010将更容易,但是WINDBG可能更有效。
由于使用WINDBG是更复杂的选择,我将详细说明(根据您的目标平台选择以下32位或64位版本):
- 下载并安装 Windows的调试工具
配置调试符号 Microsoft符号服务器
.sympath srv*<SymbolCacheDir>*http://msdl.microsoft.com/download/symbols
将崩溃转储文件加载到windbg(file->打开崩溃转储...)
为模块配置调试符号
.sympath+ <PrivatePdbDir>
加载 SOS 扩展到Windbg
.loadby sos mscorwks; * fw 2-3.5
或者
.loadby sos clr; * fw 4
下载,提取和加载 Sosex 扩展到Windbg
.load <Sosex32or64Dir>\sosex
让WindBG进行分析
!analyze -v
使用sosex显示当前的线程堆栈(包括托管和不受管理的帧)
!mk
这很可能会回答您的问题。