【问题标题】:VSTO for Outlook - Floating Window Mind Boggling BugVSTO for Outlook - 浮动窗口令人难以置信的错误
【发布时间】:2014-12-21 18:05:04
【问题描述】:

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

我一直在尝试使用 Visual Studio 2013 为 Outlook 2010 和 2013 编写插件,但是我遇到了一个非常奇怪的错误。这些是重现这个在 Outlook 中安装插件时发生的令人难以置信的错误的步骤。平台是 Windows 7 Enterprise 上的 Outlook 2010

  1. 双击电子邮件并在新窗口中打开它(检查员 窗口)
  2. 在 Windows 的任务栏中,您现在会注意到一个分层的 Outlook 的图标。在鼠标悬停时,Windows 会显示主要 Outlook 窗口和打开的电子邮件(如果在 Aero 主题中呈现) 已启用)
  3. 只需返回并关闭最大化的电子邮件。
  4. Windows 任务栏仍然显示两个分层图标,但现在如果您将鼠标悬停在上面 电子邮件窗口什么也没有显示。它就像一个幽灵般的东西 没有清理干净。

我能证明这一点的最好方法是录制一个小视频,该视频可在here 获得

然而,这并不是故事的结局。它变得更好和有趣。现在执行此操作。

  1. 重启 Outlook
  2. 像之前一样再次最大化电子邮件。
  3. 将鼠标悬停在任务栏中的图标上,可以将两层窗口的东西带到上面。您也可以从这里关闭最大化的窗口。继续做吧。
  4. 这一次您可以看到电子邮件的窗口已经消失了!任务栏现在显示一个 Outlook 图标。

为了说明这种行为,我录制了另一个视频,here 提供。

关于这种行为的几点注意事项

  1. 这仅在 Outlook 2010 上发生。在 Outlook 2013 中不会出现此行为。
  2. 我已将其缩小到一行代码。在 OutlookExplorerWrapper 中,如果注释了以下行,则该行为将从 Outlook 2010 中消失

    var s = mail.Body;

基本上简单地访问 MailItem 对象的 Body 属性会导致这种行为。我已将 Body 与 RTFBody 交换,这再次使错误消失。

我真的在我的智慧到此为止。非常感谢任何帮助!

【问题讨论】:

    标签: c# vsto outlook-2010


    【解决方案1】:

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

    您需要立即释放代码中的底层 COM 对象。

    【讨论】:

    • 代码中充斥着释放 COM 对象的正确调用。我什至将它包装为扩展方法,以便更容易使用 Marshal 类来释放 COM 资源。此外,正如我在原始帖子中指出的那样,该错误归结为一行代码。这种通用的陈述并没有真正的帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-07-19
    • 2021-11-15
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 2018-08-05
    相关资源
    最近更新 更多