2016-04-28 9 views
1

Короткий вопрос: Как правильно закрыть объекты внешнего вида после их использования?COMException, когда было открыто слишком много файлов с перспективой


Code воспроизвести проблему:

Dim olApp As New Microsoft.Office.Interop.Outlook.Application 
Dim olSelection As Microsoft.Office.Interop.Outlook.Selection = olApp.ActiveExplorer.Selection 

For i As Integer = 1 To olSelection.Count 'Outlook starts counting at 1 
    Dim olItem As Object = olSelection(i) 
    Dim sSubject As String = olItem.Subject 
    olItem.Close(Microsoft.Office.Interop.Outlook.OlInspectorClose.olDiscard) 
    Runtime.InteropServices.Marshal.ReleaseComObject(olItem) 
Next 

Объяснение:
Можно копировать элементы Outlook (MailItem, DocumentItem, PostItem, в основном любой предмет) в мое заявление. Для этого я перебираю выбранные элементы окна активного Outlook. Он отлично работает, но когда более 250 (это может быть различным в зависимости от конфигурации) элементы выбран, COMExeption брошено:

Необработанное исключение типа «System.Runtime.InteropServices.COMException» произошел в Microsoft.VisualBasic.dll

Дополнительная информация: Администратор вашего сервера ограничил количество элементов, которые вы можете открыть одновременно. Попробуйте закрыть открытые сообщения или удалить вложения и изображения из неработающих сообщений, которые вы создаете.

Я попытался закрыть предметы, когда они мне больше не нужны, но похоже, что ничего не делает.


Другие вопросы о тех же ошибках
Я знаю о this другого вопроса, что примерно таких же ошибок, но я уже следую советованию первых два ответов, а третье, принятые (и последние) ответ не вписывается в мой контекст

+0

Вы проверили [этот ответ] (http://stackoverflow.com/questions/36826927/outlook-add-in-crashes-or-your-server-administrator -has-limited-the-number-of-it? rq = 1)? Короче говоря, после 'ReleaseComObject()', установите ссылку olItem на «Nothing». –

+0

@SuperPeanut Спасибо за ответ, но добавление 'olItem = Nothing' после' ReleaseComObject' не помогло – Breeze

ответ

0

Благодаря @Dmitry Streblechenko, который указал, что коллекция Selection содержит ссылки на предметы, я нашел решение. Он удаляет элементы из Selection после их обработки и обновляет коллекцию при каждом исключении.

Вот код:

Dim olApp As New Microsoft.Office.Interop.Outlook.Application 
Dim olExplorer As Microsoft.Office.Interop.Outlook.Explorer = olApp.ActiveExplorer 
Dim olSelection As Microsoft.Office.Interop.Outlook.Selection = olExplorer.Selection 

Dim items as New List(Of Object) 

While True 
    Try 
     For i As Integer = 1 To olSelection.Count 
      Dim olItem As Object = olSelection(i) 
      Dim sSubject As String = olItem.Subject 
      olItem.Close(Microsoft.Office.Interop.Outlook.OlInspectorClose.olDiscard) 
      olExplorer.RemoveFromSelection(olItem) 
      Runtime.InteropServices.Marshal.ReleaseComObject(olItem) 
     Next 
     Exit While 
    Catch ex As Exception 
     Runtime.InteropServices.Marshal.ReleaseComObject(olSelection) 
     olSelection = olExplorer.Selection 
    End Try 
End While 
+1

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

0

Вы ничего не можете сделать - сама коллекция Selection содержит ссылки на предметы. Попробуйте включить режим кэширования.

+0

спасибо за ваш ответ, это привело меня к решению. Я был бы рад, если бы вы могли посмотреть на него и сказать мне, есть ли что-то, что я забыл – Breeze