2016-04-09 33 views
0

我試圖保存預約系列主題。這按預期工作,但在保存之後,當我執行日曆項目move/edit時,出現此錯誤。展望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(); 

    } 

我試過把我設置爲null,使用Marhsal.ReleaseComObject(i)。這兩者似乎都沒有幫助。

回答

0

我在代碼中看不到任何發佈COM對象語句。你試圖發佈什麼樣的對象?

爲什麼你總是使用AppointmentItem類的Parent屬性?

每次調用Parent屬性時,都會增加引用計數器。然後你需要在代碼中釋放這些對象。使用System.Runtime.InteropServices.Marshal.ReleaseComObject在完成使用後釋放Outlook對象。然後在Visual Basic中將變量設置爲Nothing(C#中的空值)以釋放對該對象的引用。 閱讀更多關於Systematically Releasing Objects的文章。

這裏是MSDN對於規定:

當你與定期約會項目,你應該釋放任何先前的參考,您訪問或修改項目之前獲得對定期約會項目新的參考工作,完成後立即發佈這些參考,並保存更改。此做法適用於定期的AppointmentItem對象以及任何Exception或RecurrencePattern對象。要在Visual Basic for Applications(VBA)或Visual Basic中發佈引用,請將該現有對象設置爲Nothing。在C#中,顯式釋放該對象的內存。

請注意,即使在您釋放引用並嘗試獲取新引用之後,如果仍有一個由另一個插件或Outlook持有的活動引用到上述其中一個對象,您的新引用仍將指向到過時的對象副本。因此,一旦完成定期約會,請立即發佈您的引用,這一點非常重要。

看起來像你沒有發佈代碼中的所有底層COM對象。