Outlook 2007加载项-使用BeforeItemMove事件时出现问题

Outlook 2007加载项-使用BeforeItemMove事件时出现问题,outlook,vsto,add-in,outlook-2007,outlook-addin,Outlook,Vsto,Add In,Outlook 2007,Outlook Addin,我正在写一篇Outlook 2007 addin。我所做的就是: private void ThisAddIn_Startup(object sender, System.EventArgs e) { Outlook.Folder root; //creates Spam folder if it dosen't exist if (!SpamFolderExist()) { Cre

我正在写一篇Outlook 2007 addin。我所做的就是:

        private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        Outlook.Folder root;

        //creates Spam folder if it dosen't exist
        if (!SpamFolderExist())
        {
            CreateSpamFolder();
        }

        root = (Outlook.Folder)this.Application.Session.DefaultStore.GetRootFolder();

        //set BeforeItemMove event for spam and inbox folders
        spamFolder = (Outlook.Folder)root.Folders["Spam"];
        inboxFolder = (Outlook.Folder)this.Application.ActiveExplorer().Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);

        spamFolder.BeforeItemMove += new Microsoft.Office.Interop.Outlook.MAPIFolderEvents_12_BeforeItemMoveEventHandler(BeforeItemMoveFromSpam);
        inboxFolder.BeforeItemMove += new Microsoft.Office.Interop.Outlook.MAPIFolderEvents_12_BeforeItemMoveEventHandler(BeforeItemMoveFromInbox);

        //set new mail event
        this.Application.NewMail += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_NewMailEventHandler(OnNewMail);
    }

问题是,即使我在BeforeItemMoveFromInbox和BeforeItemMoveFromSpam方法中什么都不写,应用程序也有一个奇怪的行为。在我移动一些邮件之后,它就不再对特定邮件执行任何移动操作。一封邮件似乎被阻止了,我就是无法移动它。执行其他移动操作后,会阻止其他邮件,并且可以移动以前被阻止的邮件。其想法是,邮件被阻止后,它将始终至少有一封邮件无法移动。换句话说,一些移动操作会随机失败。我必须说,除了将邮件从一个文件夹移动到另一个文件夹之外,我没有做任何其他事情,而且我没有收到任何错误消息。我还尝试在方法末尾将BeforeItemMove事件处理程序的cancel参数设置为false,但得到了相同的行为

如果我理解您上面的问题描述

如果您将该项目从收件箱移动到垃圾邮件文件夹,则会触发该事件,但如果您将同一项目移回,则该事件将不起作用??因为您必须钩住要从中移动的“所有事件”文件夹

可能发生的情况是,您可能必须释放事件处理程序中的对象
Marshal.ReleaseComObject()

您已经找到了。我也遇到了同样的问题(只是将一个文件夹连接到BeforeItemMove事件,这样当我将邮件移出该文件夹时,我无法在一小段时间内将其从新文件夹移动到另一个文件夹)


将Marshal.ReleaseComObject()添加到事件处理程序的末尾可以完美地修复它

在使用COM和Outlook时,忘记Marshal.ReleaseComObject()是一个常见问题