VSTO Ссылки на COM-объекты / Использование памяти - PullRequest
3 голосов
/ 11 апреля 2011

Мои вопросы касаются разработки VSTO .NET с Outlook.

В связи с тем, что обработчики событий .NET обрабатываются в VSTO, необходимо хранить ссылку на COM-объект, представляющий элемент для обработчика событий в вызываемом элементе. Это делается путем объявления переменной уровня класса, которая не позволяет собирать ссылки.

Мой плагин обрабатывает событие BeforeDelete для Календаря, Контактов и Задач.

Я обеспокоен тем, что хранение ссылок Списка на все отдельные элементы будет использовать много памяти для пользователей с большими коллекциями элементов Встречи, Контактов и Задач.

Мои вопросы касаются базового COM-объекта, на который я сохраняю ссылку. Содержит ли этот объект все детали элемента, или это просто указатель, который Outlook использует для загрузки данных из хранилища данных. Например, когда я получаю доступ к свойству FirstName элемента Contact, оно загружается непосредственно из памяти или загружается из PST-файла Outlooks.

Ответы [ 3 ]

4 голосов
/ 15 мая 2011

Я не рекомендую хранить ссылки на каждый элемент календаря, задачу и контакт. Это приведет к тому, что большинство RCW перейдут к поколению 1 или 2, что означает, что они вряд ли когда-нибудь будут очищены сборкой мусора. Сами объекты никогда не перемещаются в пространство .net, но вы получите RCW для каждого, что препятствует очистке памяти на неуправляемой стороне. Это также может вызвать проблемы в Outlook, когда элементы календаря заблокированы, а их размер нельзя изменить, и другие случайные проблемы ...

Я бы рекомендовал вместо этого использовать мой класс FolderMonitor из моего проекта VSTO Contrib (http://vstocontrib.codeplex.com/SourceControl/changeset/view/50a83624e34d#src%2fVSTOContrib.Outlook%2fOutlookFolderMonitor.cs), который будет вызывать удаленное событие при удалении элемента, таким образом, у вас будет только ссылка на 3 RCW (Контактная папка, Задачи). Папка и папка календаря).

3 голосов
/ 11 апреля 2011

Вы можете работать в перекрестных целях здесь

Это из справки события BEFOREDELETED

Для того, чтобы это событие сработало, когда электронное письмо, список рассылки, запись в журнале, задание, контакт или сообщение удаляются через действие, Инспектор должен быть открыт.

Что фраза "инспектор должен быть открытым" является ключевым. Вы никогда не сможете открыть инспектора для каждого электронного письма, контакта и элемента календаря. Событие BeforeDeleted применимо только к тем элементам, которые пользователь фактически открыл в Outlook.

Вместо этого вы, вероятно, хотите получить ссылку на конкретный объект FOLDER и отслеживать события в этой папке (я считаю, что это BEFOREITEMMOVE, что странно, но удаление элемента в основном переносит его в корзину).

Прошло некоторое время с тех пор, как я посмотрел на внешний вид, поэтому моя номенклатура может быть немного не такой ...

3 голосов
/ 11 апреля 2011

Это почти наверняка загружено из памяти.Но давление, которое вы оказываете на Outlook, возникает, когда вы создаете COM-объект, тогда Outlook должен делать все, что ему нужно для получения данных объекта.Что, вероятно, сохраняется до тех пор, пока вы не прекратите ссылаться на объект и не запустится поток финализатора.Но, конечно, если вы ссылаетесь на все , то, скорее всего, у Outlook возникнут трудности.Чрезмерное использование памяти и файла подкачки являются симптомами проблемы.

Это всего лишь предположение, что внутренности Outlook не задокументированы.Я настоятельно рекомендую вам попытаться создать реалистичную загрузку и взглянуть с помощью такого инструмента, как SysInternals Process Explorer.

...