Вы используете многоточечную нотацию (mi.UserProperties.Find
), что означает, что компилятор создает неявную переменную для хранения результата вызова mi.UserProperties
;вы не можете явно освободить эту переменную.Этот объект содержит ссылку на его родительский объект MailItem
.
Сохраните его в явной переменной и освободите его явно, используя Marshal.ReleaseComObject
.То же самое для переменной UserProperty up
.
Кроме того, не используйте foreach
с коллекциями Outlook - этот цикл содержит ссылку на все элементы, пока цикл не завершится.Используйте цикл for
и освобождайте элементы явно на каждом шаге цикла сразу после того, как вы закончите с этим элементом
Selection selectedItems = Globals.ThisAddIn.Application.ActiveExplorer().Selection;
for (int i = 1; i <= selectedItems .Count; i++)
{
object selection= selectedItems[i];
MailItem mi = selection as MailItem;
if (mi != null) //can have items other than MailItem
{
UserProperties props = mi.UserProperties;
UserProperty up = props .Find("MyProp");
if (up != null)
{
...
Marshal.ReleaseComObject(up);
};
Marshal.ReleaseComObject(props);
Marshal.ReleaseComObject(mi);
}; //if
Marshal.ReleaseComObject(selection);
}; //for