我需要释放COM互操作对象的内部对象吗?

3

我有一个托管类,使用的COM看起来像这样。

Public Class MyClass

    Private myobj as SomeComObject

    Public Sub New()
        myobj = CreateObject("SomeComObject.Class")
    End Sub

    Public Sub DoSomething()
        dim innerobj as SomComObject.InnerClass
        innerobj = myobj.CreateInnerClass("arg1", true, 5)
        innerobj.DoSomething()
    End Sub

End Class

由于我正在通过COM-Interob dll使用未经管理的dll,因此我想知道是否需要手动释放innerobj,或者如果我调用ReleaseObject(),gc是否足够聪明自动完成。

我的类实现了IDisposable,目前我正在执行以下操作:

Runtime.InteropServices.Marshal.ReleaseComObject(myobj)

我需要关心创建COM对象的所有内部对象是否需要释放?如果需要释放,释放的顺序是否重要(先释放内部对象还是先释放父对象)?

2个回答

1

我相当确定您应该分别释放它们。至少在使用Office自动化时,如果您不释放所有内部对象,那么会导致它们在内存中卡住,这在Office中非常容易做到,因为有很多集合。

我认为其他COM对象也是如此。


1

COM不会释放内部对象。它是另一个类的实例化对象,其类恰好属于另一个类。除非外部对象(myObj)中有显式代码来保持对创建的内部对象(在调用CreateInnerClass时创建)的句柄,否则COM不知道如何释放它。可能会在myObj类型中编写此代码,但这并不常见。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接