gpt4 book ai didi

.net - VSTO 对 COM 对象/内存使用的引用

转载 作者:行者123 更新时间:2023-12-01 18:46:39 25 4
gpt4 key购买 nike

我的问题是关于使用 Outlook 进行 VSTO .NET 开发。

由于 .NET 事件处理程序在 VSTO 中的处理方式,有必要保存对表示该项目的 COM 对象的引用,以供要触发的项目上的事件处理程序使用。这是通过声明一个类级别变量来完成的,该变量将防止引用被垃圾收集。

我的插件正在处理日历、联系人和任务的 BeforeDelete 事件。

我担心保留对所有单个项目的引用列表对于拥有大量约会项目、联系人和任务集合的用户来说会使用大量内存。

我的问题是关于我保留引用的底层 COM 对象。该对象是否包含项目的所有详细信息,或者它只是 Outlook 用于从数据存储加载详细信息的指针。例如,当我访问“联系人”项目的“名字”属性时,该属性是直接从内存加载还是从 Outlook PST 文件加载。

最佳答案

我不建议保留对每个日历项目、任务和联系人的引用。这将导致大多数 RCW 进入第 1 代或第 2 代,这意味着它们不太可能被垃圾收集清理。对象本身永远不会移动到 .net 空间中,但每个对象都会获得一个 RCW,这会阻止内存在非托管端被清理。这还可能导致 Outlook 中出现日历项目被锁定且无法调整其大小的问题,以及其他随机问题...

我建议使用我的 VSTO Contrib 项目 (http://vstocontrib.codeplex.com/SourceControl/changeset/view/50a83624e34d#src%2fVSTOContrib.Outlook%2fOutlookFolderMonitor.cs) 中的FolderMonitor 类,这会引发删除项目时删除事件,这样您将只能引用 3 个 RCW(联系人文件夹、任务文件夹和日历文件夹)。

关于.net - VSTO 对 COM 对象/内存使用的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5615471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com