2016-06-24 2 views
0

Вот мои простые шаги, чтобы произвести мою проблему с ниже кодом ...VSTO: Outlook запрашивает 3 раза для «Сохранить изменения?» ... Зачем?

  1. Выполнить проект
  2. Создать новую почту
  3. Добавить attacment
  4. Закрыть почту - и я спросил первый время для сохранения изменений - я выбираю no
  5. Закрыть приложение Outlook - меня попросили два раза сохранить изменения ... почему?

Вот мой пример кода ...

Imports System.Runtime.InteropServices 

Public Class ThisAddIn 

    Private Shared _currentMailItem As Outlook.MailItem 


    Private Sub ThisAddIn_Startup() Handles Me.Startup 
     AddHandler Me.Application.ItemLoad, AddressOf LoadMail 
    End Sub 


    Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown 
    End Sub 


    Private Shared Sub LoadMail(Item As Object) 
     If TypeOf Item Is Outlook.MailItem Then 
      _currentMailItem = TryCast(Item, Outlook.MailItem) 
      AddHandler _currentMailItem.Open, AddressOf OpenMail 
     End If 
    End Sub 


    Private Shared Sub OpenMail(ByRef Cancel As Boolean) 
     If String.IsNullOrEmpty(_currentMailItem.EntryID) Then 
      AddHandler _currentMailItem.AttachmentAdd, AddressOf MailItem_AttachementAdded 
      AddHandler _currentMailItem.Close, AddressOf MailItem_Close 
     End If 
    End Sub 


    Private Shared Sub MailItem_AttachementAdded(e As Outlook.Attachment) 
     For Each a As Outlook.Attachment In _currentMailItem.Attachments 
     Next 
    End Sub 


    Private Shared Sub MailItem_Close(ByRef cancel As Boolean) 
     If String.IsNullOrEmpty(_currentMailItem.EntryID) Then 
      RemoveHandler _currentMailItem.AttachmentAdd, AddressOf MailItem_AttachementAdded 
      RemoveHandler _currentMailItem.Close, AddressOf MailItem_Close 
     End If 
    End Sub 

End Class 

Можете ли вы понять, почему он просит у меня дважды при закрытии приложения, чтобы сохранить изменения?

Кроме того, я не уверен, когда использовать Marshal.ReleaseComObject() - как в моем For Each a As Outlook.Attachment In _currentMailItem.Attachments ... do I Marshal.ReleaseComObject (a) в цикле?

Благодаря


UPDATE ....

Этот код по-прежнему не Eventhough Я пытаюсь освободить объекты ...

Imports System.Runtime.InteropServices 

Public Class ThisAddIn 

    Private _currentMailItem As Outlook.MailItem 


    Private Sub ThisAddIn_Startup() Handles Me.Startup 
     AddHandler Me.Application.ItemLoad, AddressOf LoadMail 
    End Sub 


    Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown 
    End Sub 


    Private Sub LoadMail(Item As Object) 
     If TypeOf Item Is Outlook.MailItem Then 
      _currentMailItem = TryCast(Item, Outlook.MailItem) 
      AddHandler _currentMailItem.Open, AddressOf OpenMail 
     End If 
    End Sub 


    Private Sub OpenMail(ByRef Cancel As Boolean) 
     If String.IsNullOrEmpty(_currentMailItem.EntryID) Then 
      AddHandler _currentMailItem.AttachmentAdd, AddressOf MailItem_AttachementAdded 
      AddHandler _currentMailItem.Close, AddressOf MailItem_Close 
     End If 
    End Sub 


    Private Sub MailItem_AttachementAdded(e As Outlook.Attachment) 
     For i As Integer = 0 To _currentMailItem.Attachments.Count - 1 
      Dim a As Outlook.Attachment = _currentMailItem.Attachments(i + 1) 
      Marshal.ReleaseComObject(a) 
      a = Nothing 
     Next 
    End Sub 


    Private Sub MailItem_Close(ByRef cancel As Boolean) 
     If String.IsNullOrEmpty(_currentMailItem.EntryID) Then 
      RemoveHandler _currentMailItem.AttachmentAdd, AddressOf MailItem_AttachementAdded 
      RemoveHandler _currentMailItem.Close, AddressOf MailItem_Close 
     End If 
     Marshal.ReleaseComObject(_currentMailItem) 
     _currentMailItem = Nothing 
    End Sub 

End Class 

ответ

0

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

Используйте System.Runtime.InteropServices.Marshal.ReleaseComObject, чтобы освободить объект Outlook, когда вы его закончили. Затем установите переменную Nothing в Visual Basic (null на C#), чтобы освободить ссылку на объект. Подробнее об этом читайте в статье Systematically Releasing Objects.

Использовать петлю For вместо ForEach. Последнее не позволяет мгновенно выпустить все базовые COM-объекты. Вы можете найти полезную страницу When to release COM objects in Office add-ins developed in .NET.

+0

Я попробовал обновить свой код с вашими предложениями, но он все еще не просил меня сохранять изменения 3 раза ... любую идею? – MojoDK

+0

Где я могу увидеть обновленный код? –

+0

В начальном посте (вверху) ... создан раздел «ОБНОВЛЕНИЕ». – MojoDK