没有Visual Studio,MailItem事件不会触发

时间:2016-12-19 10:33:53

标签: vsto outlook-addin

我想从Outlook邮件项处理BeforeAttachmentAdd事件。但我的代码在Visual Studio环境中工作,但没有。你知道吗?

这是我的代码:

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*/
      }
   }
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

触发事件的对象(代码中的邮件变量)必须位于全局/类级别,以防止它被垃圾回收。在你的情况下,变量是本地的。

总的来说,您可以打开多个检查器,因此有一个包装器对象可以保存对检查器及其邮件项的引用,并在您的插件中包含此类包装器的列表。

答案 1 :(得分:0)

从我看到你可能会遇到我的按钮停止工作问题 来自E. Carter和E.Lippert的书VSTO 2007

说明

  

开始重新编程时常遇到的一个问题.NET中的Office事件被称为"我的按钮停止工作"问题。开发人员将编写一些代码来处理Office工具栏对象模型中的CommandBarButton引发的Click事件。此代码有时会暂时有效,但随后会停止。用户将单击该按钮,但Click事件似乎已停止工作。导致此问题的原因是将事件处理程序连接到其生命周期与事件的所需生命周期不匹配的对象。当您连接事件处理程序的对象超出范围或将其设置为null以使其被垃圾收集时,会发生这种情况。

我认为在你的情况下,OulookMail类型的RCW object被变量mail操纵,这是罪魁祸首。它的寿命没有得到妥善处理。在Visual Studio中不会发生这种情况的事实是,您可能处于调试模式,这会稍微改变垃圾收集,因此在您进行测试时您的对象不会被销毁。