我已部署了 VSTO Outlook 2013加载项。
GC.Collect()
就可以了吗?答案 0 :(得分:2)
没有。 Outlook不知道在您的上下文中“正确”含义。如果插件崩溃(未处理的访问冲突等),Outlook将尝试下次禁用您的插件,除非您明确将插件添加到“请勿禁用”列表。
如果您有任何值得处理的事情(如数据库连接,Outlook项目列表等),则需要在完成该对象后立即执行此操作(Marshal.ReleaseComObject)。否则Outlook和.Net运行时不希望在卸载addin时执行任何特殊操作。请记住,如果Outlook初始化快速关闭,甚至可能无法调用Shutdown()回调,因此,如果您有任何重要的事情要发布,请在完成后立即释放,不要等待关机回调。
答案 1 :(得分:2)
除了德米特里的帖子:
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中的许多可能的问题。
您可以在Systematically Releasing Objects文章中详细了解相关内容。