我想让我的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
我是在正确的轨道上吗?