何时将对象作为参数传递给Office中的Marshal.ReleaseComObject?

时间:2014-03-19 08:37:38

标签: c# vb.net com outlook-addin

我想让我的Office COM对象的内存管理正确,尤其是在我的课程中。

示例 Outlook插件查看当前选择并获取第一个选定项目。 例如

  Dim oSel as Outlook.Selection
  Dim oMailItem as Outlook.MailItem

  oSel = DirectCast(oExp.Selection, Outlook.Selection)
  oMailItem = DirectCast(oSel.Item(i), Outlook.MailItem)

  Dim newClass as New OtherClass

  newClass.methodInAnotherClass(oMailItem)

如果将oMailItem与byVal参数一起传递给新类,例如:

另一个类'方法

Public sub methodInAnotherClass(byval aMailItem as Outlook.MailItem)

     Dim myMailItem as Outlook.MailItem = Nothing

     myMailItem = aMailItem


End Sub

myMailItem也可以在这个类中传递给其他方法。

我的理解是,虽然我可能拥有此mailItem的许多.NET变量,但所有这些变量都引用相同的运行时可调用包装器(RCW)。因此在上面的示例中调用

 Marshal.ReleaseComObject(myMailItem)

与调用相同

 Marshal.ReleaseComObject(oMailItem)

因此我需要确保在完成两者之后使用它时将其称为一个。

如果现在我正在为我的Outlook插件创建一个小方法库,我应遵循哪种约定。以此为例;

我将Outlook.Selection传递给我的库方法。我的理解是我的库不应该在选择上调用Marshal.ReleaseComObject但是如果在这个选择中有一个mailitem并且我的库初始化了这个,那么我的库需要在这个邮件项上调用Marshal.ReleaseComObject。

我不确定你是否理解我的话,所以这里是代码形式

  Dim oSel as Outlook.Selection

  oSel = DirectCast(oExp.Selection, Outlook.Selection)

  Dim newClass as New OtherClass

  newClass.methodInAnotherClass(oSel)

  Marshal.ReleaseComObject(oSel)

然后在其他类方法

Public sub methodInAnotherClass(byval aSelection as Outlook.Selection)

     Dim myMailItem as Outlook.MailItem = Nothing
     myMailItem = DirectCast(aSelection.Item(i), Outlook.MailItem)


     'Do alot of things

      Marshal.ReleaseComObject(myMailItem)

End Sub

我是在正确的轨道上吗?

0 个答案:

没有答案