2016-04-09 19 views
0

予定の件名を保存しようとしています。これは期待通りに機能しますが、保存した後はmove/editのカレンダーアイテムを実行するとこのエラーが発生します。Outlook VSTO - AppointmentItemを保存する親

enter image description here

エラーを再現するコード。

public void OnMyButtonClickContext(Office.IRibbonControl control) 
    { 

     var sel = control.Context as Microsoft.Office.Interop.Outlook.Selection; 
     var i = sel[1] as Microsoft.Office.Interop.Outlook.AppointmentItem; 

     i.Parent.Subject = i.Parent.Subject + " [CONFIRMED]"; 
     i.Parent.Save(); 

    } 

Marhsal.ReleaseComObject(i)を使用してiをnullに設定しようとしました。どちらも役に立たないようです。

答えて

0

コードにリリースCOMオブジェクトステートメントが表示されません。どんなオブジェクトをリリースしようとしましたか?

なぜあなたは常にAppointmentItemクラスのParentプロパティを使用しますか?

Parentプロパティを呼び出すたびに、参照カウンタが増加します。そして、コード内にそのようなオブジェクトをリリースする必要があります。

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

はMSDNが、そのために述べているものです:

あなたは予定アイテムを定期的に作業する場合、あなたは、任意の以前の参照を解放する必要がありますが、アクセスする前に定期的な予定アイテムに新しい参照を取得またはアイテムを変更し、変更が保存されたらすぐにこれらの参照を解放してください。この習慣は、定期的なAppointmentItemオブジェクトとExceptionまたはRecurrencePatternオブジェクトに適用されます。 Visual Basic for Applications(VBA)またはVisual Basicで参照を解放するには、その既存のオブジェクトをNothingに設定します。 C#では、そのオブジェクトのメモリを明示的に解放します。

参照を解放して新しい参照を取得した後も、別のアドインまたはOutlookによって保持されているアクティブな参照が上記のオブジェクトの1つに残っている場合でも、オブジェクトの古いコピーにコピーします。したがって、定期的な予定が終了するとすぐにあなたの参照を公開することが重要です。

コード内のすべての基本COMオブジェクトを解放していないようです。

関連する問題