无法强制转换COM对象-Microsoft outlook&;C#

无法强制转换COM对象-Microsoft outlook&;C#,c#,outlook,c#-2.0,office-interop,outlook-2003,C#,Outlook,C# 2.0,Office Interop,Outlook 2003,我编写此代码是为了查看outlook邮箱中的未读项目,代码如下: Microsoft.Office.Interop.Outlook.Application app; Microsoft.Office.Interop.Outlook.Items items; Microsoft.Office.Interop.Outlook.NameSpace ns; Microsoft.Office.Interop.Outlook.MAPIFolder inbox; Microsoft.Offic

我编写此代码是为了查看outlook邮箱中的未读项目,代码如下:

 Microsoft.Office.Interop.Outlook.Application app;
 Microsoft.Office.Interop.Outlook.Items items; 
 Microsoft.Office.Interop.Outlook.NameSpace ns; 
 Microsoft.Office.Interop.Outlook.MAPIFolder inbox;

 Microsoft.Office.Interop.Outlook.Application application = new Microsoft.Office.Interop.Outlook.Application();
        app = application;
        ns =  application.Session;
        inbox = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
        items = inbox.Items;
        foreach (Microsoft.Office.Interop.Outlook.MailItem mail in items)
        {
            if (mail.UnRead == true)
            {
                MessageBox.Show(mail.Subject.ToString());
            }
        }
但在foreach循环中,我得到了以下错误:

“无法将'System.\u ComObject'类型的COM对象强制转换为接口类型'Microsoft.Office.Interop.Outlook.MailItem'。此操作失败,因为对IID'{00063034-0000-0000-C000-0000000000 46}接口的COM组件的QueryInterface调用失败,原因是以下错误:不支持此类接口。”(HRESULT的例外:0x80004002(E_NOINTERFACE))。”


您能帮助我解决此错误吗?

我测试时,以下代码运行良好。但我必须指出,我引用的是“Microsoft Outlook 14.0对象库”。您是否使用了其他版本

public class Outlook { readonly Microsoft.Office.Interop.Outlook.Items _items; readonly Microsoft.Office.Interop.Outlook.NameSpace _ns; readonly Microsoft.Office.Interop.Outlook.MAPIFolder _inbox; readonly Microsoft.Office.Interop.Outlook.Application _application = new Microsoft.Office.Interop.Outlook.Application(); public Outlook() { _ns = _application.Session; _inbox = _ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox); _items = _inbox.Items; foreach (var item in _items) { string subject= string.Empty; var mail = item as Microsoft.Office.Interop.Outlook.MailItem; if (mail != null) var subject = mail.Subject; else Debug.WriteLine("Item is not a MailItem"); } } } 公共阶级观 { 只读Microsoft.Office.Interop.Outlook.Items\u项目; 只读Microsoft.Office.Interop.Outlook.NameSpace\n; 只读Microsoft.Office.Interop.Outlook.MAPIFolder\u收件箱; 只读Microsoft.Office.Interop.Outlook.Application _Application=新的Microsoft.Office.Interop.Outlook.Application(); 公众展望() { _ns=_application.Session; _收件箱=_ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox); _items=\u inbox.items; foreach(var项目在_项目中) { string subject=string.Empty; var mail=项目名称为Microsoft.Office.Interop.Outlook.MailItem; 如果(邮件!=null) var subject=mail.subject; 其他的 Debug.WriteLine(“项不是邮件项”); } } }
请注意,在Outlook中,许多项都有一些公共属性(例如过期时间),因此,作为一种非常有效的解决方法,您可以使用“动态”数据类型—作为未知项类型的备用方案,或者作为默认值(只要您对性能影响满意).

前一段时间,我不得不处理一些类似于你的问题

        foreach (Object _obj in _explorer.CurrentFolder.Items)
        {
            if (_obj is MailItem)
            {
                 MyMailHandler((MailItem)_obj);
            }
        }
希望有帮助


这里的问题是
\u explorer.CurrentFolder.Items
可以包含比
MailItem
更多的对象(
positem
是其中之一)。

在检查其属性之前,请尝试检查该项目是否有效
MailItem

foreach (Object mail in items)
{
    if ((mail as Outlook.MailItem)!=null && (mail as Outlook.MailItem).UnRead == true)
    {
        MessageBox.Show((mail as Outlook.MailItem).Subject.ToString());
    }
}

很好!对解决方案进行了一些调整,这对我很有效

foreach (dynamic item in mailItems)
        {
            if (item is MailItem)
            {
                Response.Write("Sender: ");
                Response.Write(item.SenderEmailAddress);
                Response.Write(" - To:");
                Response.Write(item.To);
                Response.Write("<br>");
            }
        }
foreach(邮件项中的动态项)
{
如果(项目为邮件项目)
{
回复。写下(“发件人:”);
响应。写入(项。发送邮件地址);
回复。写(“-To:”);
答复.书面答复(项目.至);
响应。写入(“
”); } }
我尝试了相同的操作,收到了以下消息:无法将“System.\u ComObject”类型的COM对象强制转换为接口类型“Microsoft.Office.Interop.Outlook.PostItem”。此操作失败,因为对IID为“{00063024-0000-0000-C000-0000000000 46}的接口的COM组件的QueryInterface调用失败'由于以下错误而失败:不支持此类接口(来自HRESULT:0x80004002(E_NOINTERFACE)的异常)。这对我使用Outlook 2016和最新的Microsoft.Office.Interop.Outlook很有效。dll@Bolu不,这是我在我的c#Windows applicationMAPIFolder中写的内容不推荐使用,请改用Folder。您是否设法解决了此问题?此错误与更改Office版本一致。(它会造成一系列问题)需要做的是按此处所述编辑一些注册表文件:我在以下行中遇到相同的错误Microsoft.Office.Interop.Outlook.Application=new Microsoft.Office.Interop.Outlook.Application();您是否从服务(IIS)访问OOM?不要这样做。