2

我在 C# 中创建了一个 VSTO,它应该挂钩 Outlook 2007 的 NewMailEx 事件。但是,有时当我进行手动发送/接收时,或者当收件箱中只有 1 封未读邮件时,它不会触发。似乎它在消息实际到达之前就在收件箱中触发了。

除了使用 VSTO 的 ItemAdd 或 NewMailEX 之外,是否有更好的方法来监控每次新消息?

4

1 回答 1

3

原因是:“GC 收集 .NET 对象,它从 Outlook 包装 COM 对象)”。解决方案是保持对这个 .NET 对象的引用。最简单的方法是:

// this is helper collection.
// there are all wrapper objects
// , which should not be collected by GC
private List<object> holdedObjects = new List<object>();

// hooks necesary events
void HookEvents() {
    // finds button in commandbars
    CommandBarButton btnSomeButton = FindCommandBarButton( "MyButton ");
    // hooks "Click" event
    btnSomeButton.Click += btnSomeButton_Click;
    // add "btnSomeButton" object to collection and
    // and prevent themfrom collecting by GC
    holdedObjects.Add( btnSomeButton );
}

如果需要,您还可以为此(和其他)具体按钮(或其他对象)设置一个特殊字段。但这是最常见的解决方案。

于 2008-10-15T10:59:40.787 回答