【问题标题】:Outlook Addin ItemAdd Event handlerOutlook 插件 ItemAdd 事件处理程序
【发布时间】:2022-08-05 14:35:46
【问题描述】:

我开发了一个outlook插件,已经被很多用户使用。在我们的插件中,我们有一个功能可以捕获存储在任何特定 Outlook 文件夹下的任何电子邮件,以捕获我正在使用 ItemAdd 事件。

用户 A 和用户 B 具有相同的共享邮箱。

目前,当用户 A 注册一个用于从插件捕获电子邮件的共享文件夹时,只有用户 A 触发了 ItemAdd 事件,用户 B 也使用了我们插件中的相同共享邮箱,但对于他来说,该事件不会被触发。这是预期的吗?如果任何邮件被添加到特定文件夹中,我们是否有任何事件触发?

以下是有关如何注册事件的代码示例 sop:

                    Interop.Folder fldr = this.GetFolder(folder.EntryId);
                    if (fldr != null)
                    {
                        Interop.Items items = fldr.Items;
                        items.ItemAdd += MappedItems_ItemAdd;
                    }

        public Interop.Folder GetFolder(string entryId)
        {

            Interop.Folder retVal = null;
            try
            {

                try
                {
                    retVal = m_outlook.Application.Session.GetFolderFromID(entryId) as Interop.Folder;
                }
                catch { }
            if (retVal != null)
            {
                try
                {
                    string name = retVal.Name;
                }
                catch (Exception)
                {
                    retVal = null;
                }
            }

            return retVal;
        }

    标签: c# .net outlook vsto outlook-addin


    【解决方案1】:

    问题的原因与 Outlook 无关,而是垃圾收集器在基于 .net 的应用程序中的工作方式。例如,在代码中,您在 if 条件的有限范围内声明源项目集合:

    Interop.Folder fldr = this.GetFolder(folder.EntryId);
    if (fldr != null)
    {
       Interop.Items items = fldr.Items;
       items.ItemAdd += MappedItems_ItemAdd;
    }
    

    因此,当代码完成并退出 if 条件时,items 对象被标记为从堆中滑动。 GC 可能会在它运行的任何时间点删除对象,您将永远不会收到来自它的事件。为避免此类问题,您需要在类级别声明源对象,因此它永远不会超出处理范围,GC 也不会将其标记为收集:

    // declare at the class the source object of events
    Interop.Items items = null;
    
    // in the code somewhere you may set it up to handle events
    if (fldr != null)
    {
       items = fldr.Items;
       items.ItemAdd += MappedItems_ItemAdd;
    }
    

    【讨论】:

    • 谢谢,我正在检查这些更改。会让你知道这是否有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 2021-10-24
    • 2016-09-08
    相关资源
    最近更新 更多