我已经部署了VSTO Outlook 2013 Add-in。
从 end-user 的角度来看,是否有办法检查 add-in(COM)是否未正确释放/ cleaned-up /是否正确关闭?
从开发人员的角度来看,我如何知道要清除的内容?我知道 fields/properties 之前需要做什么,e.g. 从 IDisposable 继承的所有内容?
在 ThisAddIn_Shutdown()内,一个电话就足够GC.Collect()了吗?
GC.Collect()
除了 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 中出现许多可能的问题。
您可以在系统地释放对象文章中了解有关此内容的更多信息。
否。Outlook 不知道您的上下文中“正确”的含义。如果某个加载项崩溃(未处理的访问冲突 etc.)),则 Outlook 下次将尝试禁用您的加载项,除非您将您的加载项明确添加到“请勿禁用”列表中。
如果您有任何值得处理的内容(例如数据库连接,Outlook 项目列表 etc.)),则需要在处理完该对象(Marshal.ReleaseComObject)之后立即执行此操作。否则,Outlook 和.Net run-time 不会期望您这样做请注意,如果 Outlook 初始化快速关机,则甚至可能不会调用 Shutdown()回调,因此,如果有重要的发布要,请在完成后立即释放,不要等待关机回调。
2 回答
除了 Dmitry 的职位:
不。 .NET 对象存储在内存中的方式要求您运行两次 GC。您需要通过以下方式用 WaitForPendingFinalizers 调用两次 Collect 方法:
但是我建议立即释放 Outlook 对象。完成使用后,使用System.Runtime.InteropServices.Marshal.ReleaseComObject释放 Outlook 对象。然后在 Visual Basic 中将变量设置为 Nothing(在 C#中为 null)以释放对该对象的引用。因此,您将避免在 Outlook 中出现许多可能的问题。
您可以在系统地释放对象文章中了解有关此内容的更多信息。
否。Outlook 不知道您的上下文中“正确”的含义。如果某个加载项崩溃(未处理的访问冲突 etc.)),则 Outlook 下次将尝试禁用您的加载项,除非您将您的加载项明确添加到“请勿禁用”列表中。
如果您有任何值得处理的内容(例如数据库连接,Outlook 项目列表 etc.)),则需要在处理完该对象(Marshal.ReleaseComObject)之后立即执行此操作。否则,Outlook 和.Net run-time 不会期望您这样做请注意,如果 Outlook 初始化快速关机,则甚至可能不会调用 Shutdown()回调,因此,如果有重要的发布要,请在完成后立即释放,不要等待关机回调。