COMオブジェクトをキャストできません-Microsoft Outlook&C#
-
09-10-2019 - |
質問
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ループでは、このエラーが発生しています。
「タイプ 'システムのcomオブジェクトをキャストできません。__comobject' to interface type 'microsoft.office.interop.outlook.mailitem'。 0000-C000-000000000046} '次のエラーのために失敗しました:そのようなインターフェイスはサポートされていません(hresult:0x80004002(e_nointerface)からの例外)。
このエラーを解決する方法を教えてください。
解決
しばらく前にあなたの問題のようなものを回避しなければなりませんでした。
foreach (Object _obj in _explorer.CurrentFolder.Items)
{
if (_obj is MailItem)
{
MyMailHandler((MailItem)_obj);
}
}
それが役立つことを願っています。
ここでの問題はそれです _explorer.CurrentFolder.Items
単なるよりも多くのオブジェクトを含めることができます MailItem
(PostItem
それらの1つである)。
他のヒント
アイテムが有効であることを確認してみてください 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オブジェクトライブラリ」への言及であることに言及する必要があります。別のバージョンを使用しますか?
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"); } } }
Outlookでは、多くのアイテムにはいくつかの共通のプロパティ(有効期限の時間など)があるため、必死の回避策として、「動的」データ型を使用することができます - 不明なアイテムタイプのフォールバックシナリオとして、またはデフォルト(長い間)パフォーマンスがヒットしても元気です)。
良い!ソリューションを少し適応させました、これは私にとってうまくいきました
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>");
}
}