2016-12-19 8 views
1

Я хочу обработать событие BeforeAttachmentAdd из почтового элемента Outlook. Но мой код работает в среде Visual Studio, но не из. У вас есть идея?Событие MailItem не запускается без Visual Sutdio

Это мой код:

namespace MyOutlookProject 
{ 
    using Microsoft.Office.Interop.Outlook; 
    using OutlookApplication = Microsoft.Office.Interop.Outlook.Application; 
    using OutlookAttachment = Microsoft.Office.Interop.Outlook.Attachment; 
    using OutlookInspector = Microsoft.Office.Interop.Outlook.Inspector; 
    using OutlookMail = Microsoft.Office.Interop.Outlook.MailItem; 
    class MailManager 
    { 
     public void StartUp(OutlookApplication application) 
     { 
     _inspectors = application.Inspectors; 
     _inspectors.NewInspector += Inspectors_NewInspector; 
     } 

     private void Inspectors_NewInspector(OutlookInspector Inspector) 
     { 
     if (Inspector.CurrentItem is OutlookMail) 
     { 
      OutlookMail mail = (Inspector.CurrentItem as OutlookMail); 
      mail.BeforeAttachmentAdd += Mail_BeforeAttachmentAdd; 
     } 
     } 

     private void Mail_BeforeAttachmentAdd(OutlookAttachment Attachment, ref bool Cancel) 
     { 
     /*Never called without Visual Studio*/ 
     } 
    } 
} 

Спасибо за вашу помощь.

ответ

0

Из того, что я вижу, вы можете ударить Моя кнопка перестала работать вопрос из книги Э. Картер и Е. Липпертом VSTO 2007

Он заявляет

Один вопрос часто встречается, когда начало повторной программы. События Office в .NET известны как проблема «Моя кнопка перестала работать». Разработчик напишет некоторый код для обработки события Click, поднятого CommandBarButton в объектной модели панели инструментов Office. Этот код иногда работает временно, а затем останавливается. Пользователь нажмет кнопку, но событие Click перестанет работать. Причиной этой проблемы является подключение обработчика событий к объекту, время жизни которого не соответствует желаемому сроку жизни события. Эта подсказка возникает, когда объект, к которому вы подключаете обработчик событий, выходит из области видимости или получает значения в нуль, чтобы он собирал мусор.

Я думаю, в вашем случае, что .NET RCW object типа OulookMail манипулируют с переменной mail, который является виновником. Его срок службы не обрабатывается должным образом. Тот факт, что в Visual Studio этого не происходит, заключается в том, что вы, вероятно, находитесь в режиме Debug, который немного изменяет сборку мусора, чтобы ваш объект еще не был уничтожен, когда вы проводите тестирование.

1

Объект, запускающий события (почтовая переменная в вашем коде), должен находиться на уровне global/class, чтобы предотвратить сбор мусора. Переменная локальна в вашем случае.

В общем случае вы можете открыть несколько инспекторов, поэтому имеет смысл иметь объект-оболочку, содержащий ссылки на инспектор и его почтовый элемент, а также список таких оберток в вашем добавлении.

+0

Возможно, это сборщик мусора –

 Смежные вопросы

  • Нет связанных вопросов^_^