You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 14:45:08