运行使用MailItem.Display()和MailItem.Close()后的Outlook实例为null

时间:2018-10-19 19:34:45

标签: c# outlook automation office-interop

简短版本: 我需要在屏幕上显示当前选择的mailItem。然后,稍后我需要关闭窗口。问题在于,关闭mailItem窗口将结束Outlook应用程序实例。

详细信息: 我有一个函数调用MailItem.Display(false)在屏幕上显示当前选定的邮件项目。然后,一个单独的工具完成了一些“自动操作”的自动化(移动鼠标单击有关内容)。然后,当完成时,我有一个关闭窗口的功能。问题是,当我关闭邮件项目检查器窗口时,我的Outlook实例将全部关闭。构造Outlook实例的类保持原样,但是由于我在类中全局定义的Outlook应用程序对象现在为null,因此将来的函数调用都将失败。

;

;

这是显示mailItem的第一个功能:

    public string DisplayMail(string ID){                      
        try{
            Outlook.MailItem mailItem = (Outlook.MailItem)(oNamespace.GetItemFromID(ID,activeFolder.StoreID));

            mailItem.Display(false);
            mailItem.GetInspector.Activate(); //just to bring the window to the front if it isn't

            return("Success");

        } catch (Exception e){
            return(ErrPrefix + e.ToString());
        }
    }

以下是关闭mailItem的代码:

    public string CloseMail(string ID){
        try{
            Outlook.MailItem mailItem = (Outlook.MailItem)(oNamespace.GetItemFromID(ID,activeFolder.StoreID));
            mailItem.Close(Outlook.OlInspectorClose.olDiscard);

            return("Success");

        } catch (Exception e){
            return(ErrPrefix + e.ToString());
        }
    }

以下是一些相关的全局代码:

oApp = new Outlook.Application();
oNamespace = oApp.GetNamespace("MAPI");

我正在使用.Net Core 2.0,在玻璃上工作需要它。我正在重建一个做同样工作的旧工具,但是它非常慢并且很难进行错误检查。我试图尽可能多地离开屏幕以加快速度,因此除非绝对必要,否则我不会显示主要Outlook窗口或邮件项目。它们在后台不可见。不幸的是,在这种情况下,我必须显示mailItem,以便其他工具可以完成工作。根据我的判断,Outlook是否检测到应用程序实例死亡的最后一个Outlook窗口关闭事件。这很奇怪,因为如果窗口从不显示并且在后台运行,则该实例将继续执行,直到我释放/杀死它或解构包含该实例的类为止。

感谢您的帮助。

0 个答案:

没有答案