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

.net VSTO对COM对象/内存使用的引用,.net,com,outlook,clr,vsto,.net,Com,Outlook,Clr,Vsto,我的问题是关于VSTO.NET与Outlook的开发 由于.NET事件处理程序在VSTO中的处理方式,有必要为要激发的项上的事件处理程序保留对表示该项的COM对象的引用。这是通过声明一个类级变量来实现的,该变量将防止引用被垃圾收集 我的加载项正在处理日历、联系人和任务的BeforeDelete事件 我担心保留对所有单个项目的引用列表会占用大量内存,因为用户需要收集大量约会项目、联系人和任务 我的问题是关于我保留引用的底层COM对象。此对象是否保存项目的所有详细信息,或者它只是Outlook用于从

我的问题是关于VSTO.NET与Outlook的开发

由于.NET事件处理程序在VSTO中的处理方式,有必要为要激发的项上的事件处理程序保留对表示该项的COM对象的引用。这是通过声明一个类级变量来实现的,该变量将防止引用被垃圾收集

我的加载项正在处理日历、联系人和任务的BeforeDelete事件

我担心保留对所有单个项目的引用列表会占用大量内存,因为用户需要收集大量约会项目、联系人和任务


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

这几乎肯定是从内存加载的。但是,当您创建COM对象时,您对Outlook施加的压力就会发生,然后Outlook必须执行它需要执行的任何操作来获取对象数据。在您停止引用对象并运行终结器线程之前,它可能会一直存在。但当然,如果你引用了所有内容,那么你可能会给Outlook带来困难。内存和页面文件使用过多是故障的征兆


这只是一个猜测,Outlook的内部没有文档记录。我确实建议您尝试创建一个真实的负载,并使用SysInternals的Process Explorer之类的工具进行查看

在这里,你的工作可能会有不同的目的

这来自BEFOREDELETED事件的帮助

以便在以下情况下触发此事件: 电子邮件、通讯组列表、, 日记账分录、任务、联系人或帖子 通过一个操作、一个 检查员必须是开放的

“检查员必须公开”这句话是关键。您将永远无法为每个电子邮件、联系人和日历项目打开检查器。BeforeDeleted事件仅适用于用户在Outlook中实际打开的项目

您可能想做的是获取对特定文件夹对象的引用,并监视该文件夹上的事件(我相信这是在PreforeItemMove之前,这很奇怪,但删除项目基本上就是将其移动到垃圾箱)


我已经有一段时间没有看outlook了,所以我的命名可能有点不对劲……

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

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