我有一个使用看起来像这样的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对象创建的所有内部对象?如果我必须这样做,那么订单是否重要(首先是内部,然后是父亲与父母,然后是内部)?
答案 0 :(得分:1)
我很确定你应该单独释放它们。至少在使用Office Automation时,当你没有释放所有内部对象时,事情会被卡在内存中,这是很常见的原因,这在Office中有很多集合很容易做到。
我假设它对其他COM对象是一样的。
答案 1 :(得分:1)
COM不会释放内部对象。它是一个对象的实例化,其类恰好属于另一个类。除非外部对象(myObj
)中有显式代码来保持创建的内部对象(在调用CreateInnerClass
中创建)的句柄,否则COM不知道要释放它。可以使用myObj
类型的代码来执行此操作,但这不是典型的。