2017-06-25 34 views
0

Outlookプラグインを開発していて、コールバックNewMailExが新しく追加されたストレージに対して呼び出されないときに問題に直面しました。Outlook VSTO NewMailExが新しいストレージのために起動しない

私のコードは次のようになります。

private void ThisAddIn_Startup(object sender, System.EventArgs e) 
{ 
    Application.ItemSend += Application_ItemSend; 
    Application.NewMailEx += Application_NewMailEx; 
} 

private void Application_NewMailEx(string EntryIDCollection) 
{ 
    logger.Debug("Received e-mail with ID: {0}", EntryIDCollection); 

    var outlook_namespace = Application.GetNamespace("MAPI"); 
    dynamic item = outlook_namespace.GetItemFromID(EntryIDCollection); 

    if (!(item is Outlook.MailItem)) 
     return; 

    // do some stuff with mail 
} 

私も新しいストレージのために購読してみました:

{ 
    Application.Session.Stores.StoreAdd += Stores_StoreAdd; 
} 

private void Stores_StoreAdd(Outlook.Store store) 
{ 
    logger.Info("New store is added: " + store.DisplayName); 
    Outlook.MAPIFolder rootFolder = store.GetRootFolder(); 
    Outlook.MAPIFolder inbox = store.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox); 
    inbox.Items.ItemAdd += items_ItemAdd; 
} 


private void items_ItemAdd(object item) 
{ 
    if (item is Outlook.MailItem) 
    { 
     Outlook.MailItem mail = item as Outlook.MailItem; 
     // do some stuff with mail 
    } 
} 

しかしItemAddのみ同期中のアイテムのために呼ばれています。新しいメールの場合、NewMailExもItemAddも呼び出されません。

しかし、再起動後はすべて動作し、NewMailExはいつものように動作します。

修正方法や回避方法はありますか?

答えて

0

コンパイラが行inbox.Items.ItemAdd += items_ItemAddで作成した暗黙的な変数にイベントハンドラを設定するため、items_ItemAddイベントハンドラは起動しません。 Itemオブジェクトを専用のバリブラ(またはより良いイベントはList<Items>)に保存して、生きていてGCが決して解放しないようにする必要があります。

+0

ありがとうございます、今すぐ使えます! – user1570891

関連する問題