2010-07-12 14 views
3

J'ai une classe managée qui utilise un COM qui ressemble à ceci.Ai-je besoin de libérer des objets internes d'un objet COM Interop?

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 

Depuis que je suis en utilisant un dll non géré par une dll COM-Interob Je me demande si je dois libérer le innerobj manuellement ou si le gc est assez intelligent pour le faire automagiquement si je l'appelle ReleaseObject()

Ma classe implémente IDisposable et je fais l'atmosphère suivante:

Runtime.InteropServices.Marshal.ReleaseComObject(myobj) 

Ai-je besoin de prendre soin de libérer tous les objets internes qui sont créés par l'objet COM ou non? Et si je dois le faire, est-ce que l'ordre est important (d'abord interne puis parent vs parent puis interne)?

Répondre

1

Je suis assez certain que vous devriez les libérer tous séparément. Au moins lors de l'utilisation d'Office Automation, il est fréquent que les choses restent bloquées en mémoire lorsque vous ne libérez pas tous les objets internes, ce qui est très facile à faire dans Office où il y a tellement de collections.

Je suppose que ce serait la même chose pour les autres objets COM. COM ne libérera pas l'objet interne.

1

C'est une instanciation d'un objet dont la classe appartient à une autre classe. À moins qu'il y ait un code explicite dans l'objet externe (myObj) pour garder un handle à l'objet interne créé (créé dans l'appel CreateInnerClass), COM ne sait pas le libérer. Il pourrait y avoir du code dans le type myObj pour ce faire, mais ce n'est pas typique.