2012-06-07 89 views
1

突然得到一個System.invalidcastexception:無法將'system._object'類型的COM對象轉換爲'Microsoft.office.interop.outlook.mailitem'類型的接口...我編寫的程序正常,現在BAM !例外。Microsoft Interop Outlook c# - invalidcastexception?

不知道爲什麼......請注意我是一個新手程序員。

這裏的編碼在那裏我使用Outlook的事情的一個片段:

using Microsoft.Office.Interop.Outlook; 

static Microsoft.Office.Interop.Outlook.Application app = null; 
static _NameSpace ns = null; 
static MailItem item = null; 
static MAPIFolder inboxFolder = null; 
static MAPIFolder dest = null; 
static void SendMail(string mailSubject, string htmlMailBody, string mailTo) 
{ 
    Microsoft.Office.Interop.Outlook.Application outlookApp = new Microsoft.Office.Interop.Outlook.Application(); 
    NameSpace outlookNS = outlookApp.GetNamespace("MAPI"); 
    outlookNS.Logon(Missing.Value, Missing.Value, true, true); 
    MailItem oMsg = (MailItem)outlookApp.CreateItem(OlItemType.olMailItem); 
    oMsg.To = mailTo; 
    oMsg.Recipients.ResolveAll(); 
    StreamReader sr = new StreamReader(@"C:\Users\" + WindowsIdentity.GetCurrent().Name.Split('\\')[1] + @"\AppData\Roaming\Microsoft\Signatures\Default.htm"); 
    string signature = sr.ReadToEnd(); 
    oMsg.Subject = mailSubject; 
    oMsg.HTMLBody = htmlMailBody + "<br><br>" + signature + "</font>"; 
    oMsg.Save(); 
    ((Microsoft.Office.Interop.Outlook._MailItem)oMsg).Send(); 
    oMsg = null; 
    outlookNS = null; 
    outlookApp = null; 
} 

app = new Microsoft.Office.Interop.Outlook.Application(); 
ns = app.GetNamespace("MAPI"); 
ns.Logon(null, null, false, false); 
inboxFolder = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox); 

#region match - convert - extract 
foreach (string tifFile in Directory.GetFiles(workFolder, "*.tif", SearchOption.TopDirectoryOnly)) 
{ 
    string currentFile = Path.GetFileNameWithoutExtension(tifFile); 

    for (int i = 1; i <= inboxFolder.Items.Count; i++) 
    { 
     //##############CODE CRASHES HERE############## 

     item = (MailItem)inboxFolder.Items[i]; 
     // item = inboxFolder.Items[i]; 
     if (item.Body != "") 
     { 
      if ((item.Body.Contains("Box Number =")) && (item.Body.Contains("Contract ID = ")) && (item.Body.Contains("Branch = ")) && (item.Body.Contains(currentFile.Replace('_', '/')))) 
      { 
       // matchFound = true; 
       MailStack current = new MailStack(); 
       Console.WriteLine("________________________"); 
       Console.WriteLine("File matched \t\t:\t" + currentFile + ".tif"); 

我環顧四周,但不能使提供的答案多大意義。

任何幫助表示讚賞。

+0

有沒有在這不是一個郵件項目的收件箱中的項目。巴姆。使用* as *運算符進行投射,當您得到空時,跳過該項目。 –

+0

@HansPassant只需通過我的收件箱瀏覽一下,我的收件箱中就有一個非mailitem項目,一個會議請求。真?請問您是否可以給我舉個例子,我還沒有用過鑄造操作員?謝謝。 – Taniq

+1

真的嗎?在谷歌查詢中輸入「c#as operator」。 –

回答

2

嘗試......

item = inboxFolder.Items[i] as MailItem; 
if (item != null) 
{ 
    // ... 
} 
+1

我試過這個似乎拿起來 - 現在非郵件物品。 – Taniq