首页 文章

VSTO Outlook Add-in-如何检查 Shutdown()时是否未收集资源(COM)?

提问于
浏览
1

我已经部署了VSTO Outlook 2013 Add-in

  • 从 end-user 的角度来看,是否有办法检查 add-in(COM)是否未正确释放/ cleaned-up /是否正确关闭?

  • 从开发人员的角度来看,我如何知道要清除的内容?我知道 fields/properties 之前需要做什么,e.g. 从 IDisposable 继承的所有内容?

  • 在 ThisAddIn_Shutdown()内,一个电话就足够GC.Collect()了吗?

2 回答

  • 2

    除了 Dmitry 的职位:

    3.Within ThisAddIn_Shutdown(),打个电话 GC.Collect()就足够了吗?

    不。 .NET 对象存储在内存中的方式要求您运行两次 GC。您需要通过以下方式用 WaitForPendingFinalizers 调用两次 Collect 方法:

    GC.Collect
    GC.WaitForPendingFinalizers
    GC.Collect
    GC.WaitForPendingFinalizers
    

    但是我建议立即释放 Outlook 对象。完成使用后,使用System.Runtime.InteropServices.Marshal.ReleaseComObject释放 Outlook 对象。然后在 Visual Basic 中将变量设置为 Nothing(在 C#中为 null)以释放对该对象的引用。因此,您将避免在 Outlook 中出现许多可能的问题。

    您可以在系统地释放对象文章中了解有关此内容的更多信息。

  • 2
    • 否。Outlook 不知道您的上下文中“正确”的含义。如果某个加载项崩溃(未处理的访问冲突 etc.)),则 Outlook 下次将尝试禁用您的加载项,除非您将您的加载项明确添加到“请勿禁用”列表中。

    • 如果您有任何值得处理的内容(例如数据库连接,Outlook 项目列表 etc.)),则需要在处理完该对象(Marshal.ReleaseComObject)之后立即执行此操作。否则,Outlook 和.Net run-time 不会期望您这样做请注意,如果 Outlook 初始化快速关机,则甚至可能不会调用 Shutdown()回调,因此,如果有重要的发布要,请在完成后立即释放,不要等待关机回调。

相关问题