Когда правильно выпускать COM-объекты Outlook? - PullRequest
0 голосов
/ 21 февраля 2019

Я знаю, что подобные вопросы задавались здесь, но я чувствую, что не правильно их понимаю.

У меня есть следующий код, например:

Microsoft.Office.Interop.Outlook.Explorer expl = myOutlooApplication.ActiveExplorer();
if (expl.Selection.Count > 0)
{
    object selObject = expl.Selection[1];
    if (selObject is Microsoft.Office.Interop.Outlook.MailItem)
    {
        mailItem = (selObject as Microsoft.Office.Interop.Outlook.MailItem);
        this.myUserControl.MailItem = mailItem;
    }
}

Как вы можетевидите, MailItem передается в свойство myUserControl.MyUserControl потребуется получить доступ к этому свойству позже, чтобы извлечь некоторую информацию из MailItem.

Должен ли я Marshal.ReleaseComObject() после передачи MailItem в myUserControl, чтобы уменьшить счетчик ссылок RCW, или это слишком рано?

РЕДАКТИРОВАТЬ: Моя проблема в том, что файл MSG будет открыт из файловой системы.После закрытия инспектора пользователь снова пытается открыть файл, но он заблокирован, и я уверен, что причиной этого является не высвобождение объектов COM.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Оператор «is» создает переменную impliict, поэтому у вас есть утечка прямо здесь (GC, конечно, ее устранит).Измените свой код на следующий.Он не поможет вам с файлом MSG, так как он никогда не доступен через проводник.this.myUserControl.MailItem должен быть также выпущен, как только вы закончите.

    object selObject = expl.Selection[1];
    MailItem mailItem =  selObject as MailItem;
    if (mailItem != null)
    {
        this.myUserControl.MailItem = mailItem;
    }
    Marshal.ReleaseComObject(mailItem);
0 голосов
/ 21 февраля 2019

Если у вас нет документированной утечки памяти, связанной с вашими COM-объектами, не начинайте связываться с Marshal COM-методами. RCW заботится о том, чтобы перевести сборщик мусора в мире .NET в мир подсчета ссылок COM и, как правило, справляется с этим.

Вы могли бы рассмотрите возможность вытеснения с помощью Marshal.FinalReleaseComObject в точке, в которой вы уверены , что никакие управляемые ссылки на объект не будут доступны и COM-объект потребляет значительные ресурсы.Возможно, вы захотите использовать оболочку IDisposable для перевода , которая , в термины .NET.Вы, конечно, не в той позиции в показанном вами коде - вы знаете, что только что передали управляемую ссылку на RCW на myUserControl, и вы, вероятно, ожидаете, что он получит доступ к этой ссылке.

.NET-ссылки на RCW - это , а не тип ссылок, которые считает COM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...