我已经在C#中创建了一个VSTO,它应该钩住Outlook 2007的NewMailEx事件。但是,当我执行手动发送/接收或收件箱中只有1条未读邮件时,有时不会触发。在邮件实际到达之前,它似乎好像在收件箱中触发了。

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

最佳答案

原因是:“ 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 );
}


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

09-16 12:02