使用WPF C#获取Outlook邮件时抛出System.InvalidCastException异常
异常触发原因
- Outlook 收件箱的
Items集合里不只有MailItem(邮件项)类型的对象,还包含会议邀请、任务项、日历项、联系人卡片等其他类型的COM对象,你在遍历过程中直接强制转换为MailItem,碰到非邮件类型的对象时就会抛出接口不支持的类型转换异常。 - 你给出的第二段代码还存在逻辑错误:循环中没有按索引获取对应位置的项,直接使用未正确赋值的
mailItem变量,也会触发异常。
解决方案
修正遍历逻辑,增加类型判断
遍历项时不要直接强转,使用as操作符做安全转换,转换结果为null则说明不是MailItem类型,直接跳过即可。
正确的foreach写法:
foreach (object item in oInbox.Items) { // 安全转换,非MailItem类型返回null MailItem mailItem = item as MailItem; if (mailItem != null) { string a = mailItem.Subject; // 处理业务逻辑 // 处理完后释放COM对象,避免残留Outlook后台进程 Marshal.ReleaseComObject(mailItem); } Marshal.ReleaseComObject(item); }
正确的for循环写法:
// 提前缓存Count,避免每次循环都重复调用COM接口获取计数 int itemCount = oInbox.Items.Count; for (int i = 1; i <= itemCount; i++) { object item = oInbox.Items[i]; MailItem mailItem = item as MailItem; if (mailItem != null) { string a = mailItem.Subject; // 处理业务逻辑 Marshal.ReleaseComObject(mailItem); } Marshal.ReleaseComObject(item); }
额外注意事项
- 项目需确保已正确引用对应版本的
Microsoft.Office.Interop.Outlook程序集,程序集版本要和你使用的Outlook 2016版本匹配。 - 所有用完的Outlook COM对象都需要调用
Marshal.ReleaseComObject释放,否则会导致Outlook进程在关闭后仍残留后台运行。
内容的提问来源于stack exchange,提问作者User_AA
相关产品推荐
相关产品推荐

