VSTO for Outlook - 浮动窗口令人难以置信的Bug

时间:2014-12-21 18:05:04

标签: c# vsto outlook-2010

此添加的代码可用here。演示行为的视频列在本说明的正文中。为方便起见,这里有两个链接 Bug WorkAround

我一直在尝试使用Visual Studio 2013为Outlook 2010和2013编写一个Add In,但是我遇到了一个非常奇怪的错误。这些是重现这个令人难以置信的错误的步骤,当在Outlook中安装add时会发生这种错误。该平台是Windows 7企业版的Outlook 2010

  1. 双击电子邮件并在新窗口中打开(检查员 窗口)
  2. 在Windows的TaskBar中,您现在会注意到分层 Outlook的图标。在鼠标悬停时,Windows会显示主要内容 Outlook窗口和打开的电子邮件(在Aero主题中呈现,如果 启用)
  3. 只需返回并关闭最大化的电子邮件即可。
  4. Windows TaskBar仍然显示如上所示的两个分层图标,但现在如果您将鼠标悬停在上面 它没有显示任何电子邮件窗口。它就像一个幽灵的东西 没有被清理干净。
  5. 我能证明这一点的最好方法是录制一个可用的小视频here

    然而,这不是故事的结尾。它变得更好,更有趣。现在就这样做。

    1. 重新启动Outlook
    2. 如前所述,再次最大化电子邮件。
    3. 将鼠标悬停在任务栏中的图标上,以显示两个分层窗口的内容。您也可以从这里关闭最大化窗口。来吧,做到这一点。
    4. 这次您可以看到电子邮件的窗口已经消失了!任务栏现在显示Outlook的单个图标。
    5. 为了说明这种行为,我录制了另一个可用的视频here

      有关此行为的几点注意事项

      1. 仅在Outlook 2010上发生这种情况。使用Outlook 2013时,此行为不会显示。
      2. 我已将其缩小为一行代码。在OutlookExplorerWrapper中,如果注释了以下行,则行为将从Outlook 2010中消失

        var s = mail.Body;

      3. 基本上只是访问MailItem对象上的Body属性会导致此行为。我已经用RTFBody交换了Body,这又让bug消失了。

        我真的在我的智慧结束。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:-1)

我查看了示例项目,并没有注意到任何用于释放底层COM对象的语句。使用System.Runtime.InteropServices.Marshal.ReleaseComObject释放Outlook对象。然后在Visual Basic中将变量设置为Nothing(C#中为null)以释放对该对象的引用。您可以在MSDN中的Systematically Releasing Objects文章中了解有关该内容的更多信息。

您需要立即在代码中释放基础COM对象。