如何在C++中查看CLR抛出的EEFileLoadException及FileName属性?
C++调用.NET COM DLL时EEFileLoadException的调试解决方案
一、让调试器识别EEFileLoadException类型
EEFileLoadException是CLR内部私有异常类型,默认VS调试器未加载其符号信息,可通过以下方式解决:
- 启用微软公共符号服务器:
- 打开VS2019「工具」→「选项」→「调试」→「符号」
- 勾选「Microsoft符号服务器」,设置本地符号缓存目录(如
C:\Symbols) - 确认后重新调试,调试器会自动下载CLR相关符号,此时即可识别
EEFileLoadException类型
- 手动加载clr.dll符号:
若自动下载失败,找到对应版本clr.dll的.pdb文件,调试时打开「模块」窗口,右键clr.dll选择「加载符号」并指定pdb路径
二、获取FileLoadException的FileName属性
符号加载完成后,按以下步骤操作:
- 在
_CxxThrowException断点处,打开监视窗口,输入表达式:
得到内部封装的((EEFileLoadException*)pExceptionObject)->m_pInnerExceptionSystem.IO.FileLoadException对象指针 - 接着输入以下表达式直接查看FileName属性:
((System.IO.FileLoadException*)((EEFileLoadException*)pExceptionObject)->m_pInnerException)->FileName - 更简便的方式:若混合模式调试配置正常,直接在监视窗口输入
@$exception,展开后即可查看当前CLR异常的FileName属性
三、符号加载失败时的替代方案
- 强制CLR异常中断:
- 打开VS「调试」→「窗口」→「异常设置」
- 展开「Common Language Runtime Exceptions」,找到
System.IO.FileLoadException并勾选「抛出时中断」 - 重启调试,调试器会直接在CLR抛出异常时中断,无需进入C++的
_CxxThrowException函数,可直接查看异常详情
- 日志辅助排查:
在.NET COM DLL中添加全局异常捕获逻辑,捕获FileLoadException时将FileName写入日志,或通过COM接口把错误信息返回给C++调用方
内容的提问来源于stack exchange,提问作者ynaka
相关产品推荐
相关产品推荐

