Outlook Addin:如何按照微软文档的建议主动释放内存?

2024-04-12

Outlook 插件尝试正确检索 Outlook.Exceptions。我找到了以下文档:

https://learn.microsoft.com/de-de/office/client-developer/outlook/pia/how-to-find-a-specific-appointment-in-a-recurring-appointment-series https://learn.microsoft.com/de-de/office/client-developer/outlook/pia/how-to-find-a-specific-appointment-in-a-recurring-appointment-series

那里说:[...] 当您处理定期约会项目时,您应该释放所有先前的引用,在访问或修改该项目之前获取对定期约会项目的新引用,并在完成并保存约会项目后立即释放这些引用。变化。此实践适用于重复 AppointmentItem 对象以及任何 Exception 或 RecurrencePattern 对象。要释放 Visual Basic 中的引用,请将该现有对象设置为 Nothing。在 C# 中,显式释放该对象的内存。 [...]

现在我的问题是我该怎么做?引用页面上的示例没有显式释放内存?

将 appt 设置为 null 就足够了吗?


设置为 null 肯定是不够的。在这种情况下,您还必须强制垃圾收集器尽快清理堆。您可以通过调用正确地执行此操作GC.Collect() and GC.WaitForPendingFinalizers()。调用两次是安全的,end 确保循环也肯定被清理。

但我建议使用System.Runtime.InteropServices.Marshal.ReleaseComObject使用完 Outlook 对象后释放该对象。然后设置一个变量为Nothing在 Visual Basic 中(null在 C# 中)释放对对象的引用。如果您的加载项尝试枚举存储在 Microsoft Exchange Server 上的集合中超过 256 个 Outlook 项目(该数字在最新版本中有所增加),这一点尤其重要。如果您不及时释放这些对象,您可能会达到 Exchange 对每次打开的最大项目数的限制。

The ReleaseComObject方法用于显式控制托管代码中使用的 COM 对象的生命周期。您应该使用此方法及时释放持有资源引用的底层 COM 对象,或者当必须按特定顺序释放对象时。

每次 COM 接口指针进入公共语言运行时 (CLR) 时,它都会被包装在 RCW 中。

RCW 有一个引用计数,每当 COM 接口指针映射到它时,该引用计数就会递增。这ReleaseComObject方法减少 RCW 的引用计数。当引用计数达到零时,运行时释放其对非托管 COM 对象的所有引用,并抛出System.NullReferenceException如果您尝试进一步使用该对象。如果同一个 COM 接口从非托管代码多次传递到托管代码,则包装器上的引用计数每次都会递增,并且调用 ReleaseComObject 将返回剩余引用的数量。

The ReleaseComObject方法使您能够强制释放 RCW 引用计数,以便它在您想要的时候准确发生。然而,使用不当ReleaseComObject可能会导致您的应用程序失败,或者可能导致访问冲突。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Outlook Addin:如何按照微软文档的建议主动释放内存? 的相关文章

随机推荐