Vb.net 我是否需要释放COM互操作对象的内部对象?
我有一个托管类,它使用一个COM,看起来像这样Vb.net 我是否需要释放COM互操作对象的内部对象?,vb.net,com-interop,dispose,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
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对象创建的所有内部对象?如果我必须这样做,那么顺序是否重要(先是内部然后是父级还是父级然后是内部)?我相当确定您应该分别发布它们。至少在使用Office Automation时,当您不释放所有内部对象时,内存中会出现问题,这是一个常见的原因。在Office中,有这么多集合,很容易做到这一点
我假设其他COM对象也是如此。COM不会释放内部对象。它是一个对象的实例化,该对象的类恰好属于另一个类。除非外部对象(
myObj
)中有显式代码来保留已创建内部对象的句柄(在调用CreateInnerClass
中创建),否则COM不知道如何释放它。在myObj的myObj
类型中可能有代码来执行此操作,但这并不典型