Почему (inspector.CurrentItem! = Null) приводит к открытому дескриптору файла, который не закрыт - PullRequest
0 голосов
/ 03 июня 2019

Если Outlook открывает файл MSG и моя надстройка обращается к Microsoft.Office.Interop.Outlook.Inspector.MailItem, а затем файл закрывается.Дескриптор файла остается открытым для файла, предотвращая его удаление или переименование, пока Outlook не завершит работу.

Идентификатор не имеет значения, сохранен файл или нет, или я вообще что-то делаю с MailItem.

Вот мой код GetCurrentMailItem (), который воспроизводит проблему.

    private Outlook.MailItem GetCurrentMailItem()
    {
    Outlook.MailItem mailItem = null;
    Microsoft.Office.Interop.Outlook.Inspector inspector = this.Application.ActiveInspector();

    if (inspector != null && inspector.CurrentItem != null)
        {
            //if (inspector.CurrentItem is Outlook.MailItem)
                //mailItem = inspector.CurrentItem;
        }
        return mailItem;
    }

ПРИМЕЧАНИЕ. Мне даже не нужно возвращать CurrentItem, достаточно просто проверить его на NULL, чтобы воспроизвести это.

Если я не выполню тест «inspector.CurrentItem! = Null» в этом коде и просто верну NULL, проблем с дескриптором открытого файла не возникнет.

Добавление вложения с помощью стандартной кнопки вложенияне приводит к этой проблеме.

1 Ответ

0 голосов
/ 03 июня 2019

Конечно - inspector.CurrentItem возвращает объект MailItem.Что вы решили с этим делать, Outlook не знает и не заботится.Вы решили положиться на сборщик мусора, чтобы освободить неявную переменную, созданную для вас компилятором.

Используйте явную переменную, которую вы можете явно освободить:

if (inspector != null)
{
    object item = inspector.CurrentItem;
    if (item != null)
    {
       //blah
       Marshal.ReleaseComObject(item); 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...