Невозможно бросить COM-объект - Microsoft Outlook & C #
-
09-10-2019 - |
Вопрос
Я написал этот код для просмотра непрочитанных элементов в My Outlook Mail Mail, а вот код:
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());
}
}
Но на петле FORACH я получаю эту ошибку:
«Невозможно изменить объект системы типа .__ ComObject» в тип интерфейса «Microsoft.Office.interop.Outlook.mailitem». Эта операция не удалась, потому что вызов QueryInterFace на COM-компонент для интерфейса с IID '{00063034-0000- 0000-C000-00000000000046} 'Не удалось из-за следующей ошибки: такого интерфейса не поддерживается (исключение из HResult: 0x80004002 (e_nointerface)). "
Можете ли вы помочь мне, как разрешить эту ошибку?
Решение
Я должен был обойти что-то вроде вашей проблемы назад.
foreach (Object _obj in _explorer.CurrentFolder.Items)
{
if (_obj is MailItem)
{
MyMailHandler((MailItem)_obj);
}
}
Надеюсь, это поможет.
Проблема вот что _explorer.CurrentFolder.Items
может содержать больше объектов, чем просто MailItem
(PostItem
Быть одним из них).
Другие советы
попробуйте проверить элемент действительный 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());
}
}
Следующий код работал нормально, когда я проверил его. Но я должен упомянуть, что моя ссылка была на «Библиотеку объектов Microsoft Outlook 14.0». Вы служите, чтобы использовать другую версию?
Общественный класс Outlook {Readly Microsoft.office.interop.Outlook.items _ TiTems; Readly Microsoft.Office.interop.Outlook.Nameax _ns; Readly Microsoft.Office.interop.Outlook.mapifolder _inbox; Readly Microsoft.Office.interop.Outlook.Application _Application = новый Microsoft.Office.interop.Outlook.Application (); Общественный прогноз () {_ns = _Application.Session; _inbox = _ns.getddefaultfolder (Microsoft.Office.interop.Outlook.oldefaultFolders.Olkolderinbox); _TEMS = _INBOX.ITEMS; foreach (vart in _ _ _ _ {строковой тема = string.empty; var mail = товар как microsoft.office.interop.Outlook.mailitem; if (mail! = null) var public = mail.subject; остальное Debug.Writeline («Пункт не является почтеном»); }}}
Обратите внимание, что в Outlook многие элементы имеют некоторые общие свойства (например, время истечения срока), так что вы можете, как отчаянный обходной путь, используйте «динамический» тип данных - либо в качестве сценария «Dynamic» для неизвестных типов элементов или по умолчанию (как долго Как у вас все в порядке с достижением производительности).
Ницца! Адаптировал решение немного, это хорошо сработало для меня
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>");
}
}