Нужно ли освобождать внутренние объекты объекта COM Interop? - PullRequest
3 голосов
/ 12 июля 2010

У меня есть управляемый класс, который использует 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

Поскольку я использую неуправляемую dll через dll COM-Interob, мне интересно, нужно ли мне освобождать innerobj вручную илиесли gc достаточно умен, чтобы делать это автоматически, если я вызываю ReleaseObject ()

Мой класс реализует IDisposable, и я делаю следующее:

Runtime.InteropServices.Marshal.ReleaseComObject(myobj)

Нужно ли мне позаботиться об освобождениивсе внутренние объекты, созданные объектом COM или нет?И если я должен это сделать, имеет ли значение порядок (сначала внутренний, затем родительский, а потом родительский, затем внутренний)?

Ответы [ 2 ]

1 голос
/ 15 июля 2010

COM не освободит внутренний объект. Это создание объекта, класс которого принадлежит другому классу. Если во внешнем объекте нет явного кода (myObj) для хранения дескриптора созданного внутреннего объекта (созданного в вызове CreateInnerClass), COM не знает, как его освободить. Для этого может быть код типа myObj, но это не типично.

1 голос
/ 12 июля 2010

Я вполне уверен, что вы должны выпустить их все по отдельности. По крайней мере, при использовании Office Automation распространенная причина того, что вещи застряли в памяти, когда вы не освобождаете все внутренние объекты, это очень легко сделать в Office, где так много коллекций.

Я бы предположил, что это будет то же самое для других объектов COM.

...