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(使用前将#替换为@)