2016-06-24 12 views
0

はここで...以下のコードで私の問題を生成するために、私の簡単な手順をだVSTO:Outlookは「変更を保存しますか? ... なぜ?

  1. 実行プロジェクト
  2. メールを閉じattacment
  3. を追加し、新しいメール
  4. を作成する - と私は最初に尋ねましたよ変更を保存する時間 - 私はnoを選択します
  5. Outlookアプリケーションを閉じます - 変更を保存するために2回質問します...なぜですか?ここで

は私のサンプルコードは、変更を保存するにはアプリを閉じたとき、それは私の二回に尋ねるなぜ

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のように...私はMarshal.ReleaseComObject(a)をループに入れますか?

おかげ


このコードはまだ本家失敗UPDATE ....

私は、オブジェクトを解放しようと...

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オブジェクトを即座に使用できます。ユーザーによって閉じられたオブジェクトへの参照を保持すると、そのようなダイアログが表示されます。

Outlookオブジェクトの使用を終了したら、System.Runtime.InteropServices.Marshal.ReleaseComObjectを使用してOutlookオブジェクトを解放します。次に、変数をVisual BasicのNothing(C#ではnull)に設定して、オブジェクトへの参照を解放します。詳細については、Systematically Releasing Objectsの記事をご覧ください。

ForEachの代わりにForループを使用してください。後者は、すべての基盤となるCOMオブジェクトを即座に解放することはできません。 When to release COM objects in Office add-ins developed in .NETページが役立ちます。

+0

あなたの提案で自分のコードを更新しようとしましたが、変更を3回保存するように依頼するのに失敗しました。 – MojoDK

+0

コードはどこで更新できますか? –

+0

最初の投稿(上部)に...「更新」セクションが作成されました。 – MojoDK

関連する問題