Outlook VSTO NewMailEx не запускается для нового хранилища
Я разрабатываю плагин для Outlook и столкнулся с проблемой, когда мой обратный вызов 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 работает как обычно.
У вас есть идеи, как это исправить или какой-то обходной путь?
1 ответ
Ваш обработчик события items_ItemAdd никогда не сработает, потому что вы установили обработчик события для неявной переменной, созданной компилятором в строке inbox.Items.ItemAdd += items_ItemAdd
, Вам нужно сохранить объект Items в выделенном переменном (или событии List<Items>
), чтобы убедиться, что он остается в живых и GC никогда не выпускает его.