时间:2010-07-12 06:58:43

标签: vb.net com-interop dispose

我有一个使用看起来像这样的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,我执行以下atm:

Runtime.InteropServices.Marshal.ReleaseComObject(myobj)

我是否需要处理释放COM对象创建的所有内部对象?如果我必须这样做,那么订单是否重要(首先是内部,然后是父亲与父母,然后是内部)?

2 个答案:

答案 0 :(得分:1)

我很确定你应该单独释放它们。至少在使用Office Automation时,当你没有释放所有内部对象时,事情会被卡在内存中,这是很常见的原因,这在Office中有很多集合很容易做到。

我假设它对其他COM对象是一样的。

答案 1 :(得分:1)

COM不会释放内部对象。它是一个对象的实例化,其类恰好属于另一个类。除非外部对象(myObj)中有显式代码来保持创建的内部对象(在调用CreateInnerClass中创建)的句柄,否则COM不知道要释放它。可以使用myObj类型的代码来执行此操作,但这不是典型的。