2016-04-09 34 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对象。