【问题标题】:How to handle application lifetime in an Outlook PIA implementation如何在 Outlook PIA 实施中处理应用程序生命周期
【发布时间】:2015-12-08 14:16:37
【问题描述】:

问题陈述

当 Outlook 退出时,通过 PIA 注册的任何事件都将丢失,并且当前在内存中的任何 PIA 对象都将无法访问。

复制

这是一个简单的控制台应用程序,说明了当前的问题:

static void Main(string[] args)
{
    var outlookApp = new Application();
    var ns = outlookApp.GetNamespace("MAPI");
    var calendar = ns.GetDefaultFolder(OlDefaultFolders.olFolderCalendar);
    var appointment = (AppointmentItem) calendar.Items.GetFirst();

    ((ApplicationEvents_11_Event) outlookApp).Quit +=
        () => Console.WriteLine("Outlook is quitting");

    while (true)
    {
        Console.WriteLine("Explorers: " + outlookApp.Explorers.Count);
        Console.WriteLine("Folders: " + ns.Folders.Count);
        Console.WriteLine("Items: " + calendar.Items.Count);
        Console.WriteLine("Start date: " + appointment.Start);
        Thread.Sleep(2000);
    }
}

当我运行此应用程序时,如果 Outlook 尚未运行,它会在单独的进程(显示在系统托盘中)中启动 Outlook 实例。我知道有三种情况会导致Quit 事件触发:

  1. Outlook 处于“隐藏”状态,可通过从系统托盘图标的上下文菜单中选择立即退出来退出。
  2. 应用程序启动时 Outlook 已在运行,用户关闭或退出正在运行的资源管理器。
  3. 应用程序启动时 Outlook 未运行,因此以“隐藏”状态启动,但随后用户通过运行可执行文件或选择打开 Outlook 启动了 Outlook 应用程序从系统托盘图标的上下文菜单中。然后用户关闭或退出正在运行的资源管理器。

这些对我的程序都有相同的影响:Quit 事件被触发,然后我访问 Outlook 对象的一次尝试失败并返回 COMException

问题

处理此问题的标准或推荐方法是什么?理论上,应用程序退出可以随时异步发生。我是否需要在使用 PIA 的任何操作上捕获 COMException 并在发生该异常时从调用 new Application() 重新启动操作?这可能很棘手,具体取决于操作的复杂性。

事件处理程序呢?我是否需要跟踪已添加到 Outlook 对象的所有事件处理程序,然后在收到Application.Quit 事件时重新添加它们?

用户体验如何?假设用户从系统托盘的上下文菜单中选择了Exit Now,然后图标立即重新出现,因为我的应用程序检测到了退出并重新初始化了所有内容。我是否应该向用户弹出某种对话框,通知他们我需要 Outlook 才能使我的应用程序正常运行?

在系统关闭的情况下怎么办?大概我会在收到来自 Outlook 的 Application.Quit 之前收到 SystemEvents.SessionEnding 事件。这是有保证的,还是我应该在恢复通信之前等待一段时间,看看系统是否正在停机?是否有其他方法可以检测我们是否处于会话结束状态?

为多方面的问题道歉。如果有文章已经解决了这个主题,欢迎提供阅读材料的链接。经过大量的搜索,我没有找到。

【问题讨论】:

    标签: c# outlook office-interop office-pia


    【解决方案1】:

    如果 Application.Quit 没有触发,您可以连接 Explorer.Close 和 Inspector.Close 事件并检查 Aplication.Explorers.Count 和 Aplication.Inspectors.Count 是否均为 0(或 1,因为您正在处理的事件仍在窗口是否打开)。

    要关联这些事件,请跟踪 Application.Explorers.NewExplorer 和 Application.Inspectors.NewInspector 事件。要连接 Outlook 已显示的资源管理器和检查器,请在启动时循环访问 Application.Explorers 和 Application.Inspectors 集合。

    【讨论】:

      猜你喜欢
      • 2020-05-14
      • 2014-05-04
      • 2019-11-20
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      • 2016-09-17
      • 2010-10-31
      相关资源
      最近更新 更多