【问题标题】:Reference to Inspector.CurrentItem causes reminders to keep coming back对 Inspector.CurrentItem 的引用导致提醒不断回来
【发布时间】:2019-10-07 07:15:32
【问题描述】:

我正在创建一个简单的 Outlook 加载项来处理提醒。当我创建一个包含房间的会议并在我的新检查器事件处理程序中引用 Inspector.CurrentItem 时,会创建一个提醒,该提醒会在解雇后返回。

我使用的是 Outlook 2013 和 Visual Studio 2017。如果我没有在会议邀请中包含房间,则提醒将正确关闭。我将问题归结为以下代码。 (如果我注释掉对 Inspector.CurrentItem 的引用,提醒会正确关闭。)

public partial class ThisAddIn
{
    private Outlook.Inspectors inspectors { get; set; }
    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        inspectors = Application.Inspectors;
        inspectors.NewInspector +=
        new Outlook.InspectorsEvents_NewInspectorEventHandler(Inspectors_NewInspector);
    }

    void Inspectors_NewInspector(Outlook.Inspector Inspector)
    {
        var currentItem = Inspector.CurrentItem; //Just referring to Inspector.CurrentItem causes a persistent reminder that won't go away.
    }
    ...
}

由于管理限制,我无法尝试可能的修复方法,包括清除我机器上的 Outlook 提醒。

【问题讨论】:

  • 我不知道您原来的问题,但是您需要将检查器变量声明提升到类级别,否则它将被 GC 释放并且不会触发任何事件。
  • @DmitryStreblechenko 如果你注意到,它只是对类级别对象的引用
  • 不,您的“inspectors”变量是在本地(ThisAddIn_Startup 方法)级别声明的。它必须在类级别声明。
  • 按照建议将检查器属性移动到类级别。虽然这是个好主意,但对持续提醒问题没有帮助。

标签: c# outlook-addin office-interop


【解决方案1】:

原来是this article 中描述的垃圾收集问题。 (Outlook COM 对象垃圾回收不是自动的,必须手动完成。)

通过添加解决了:

using System.Runtime.InteropServices;
...
Marshal.ReleaseComObject(currentItem);

【讨论】:

    猜你喜欢
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    相关资源
    最近更新 更多