2010-02-26 3 views
1

Étant donné que les objets COM contiennent des ressources non-mémoire, mais ne prennent pas en charge IDisposable, j'essaie quelques idées pour le truquer. Que penses-tu de ma première tentative?IDisposable et COM

Public Function ComBlock(ByVal ParamArray comObjects As Object()) As IDisposable 
    For i As Integer = 0 To comObjects.Length - 1 
     If comObjects(i) Is Nothing Then Throw New ArgumentNullException("Null in parameter " & i) 
     If Not Marshal.IsComObject(comObjects(i)) Then Throw New ArgumentException(comObjects(i).GetType.Name & " is not a COM object") 
    Next 

    Return New ComContext(comObjects) 
End Function 

Private Class ComContext : Implements IDisposable 
    Private m_ComObjects As Object() 
    Private m_Disposed As Boolean 

    Sub New(ByVal comObjects As Object()) 
     m_ComObjects = comObjects 
    End Sub 

    Private Sub Dispose() Implements IDisposable.Dispose 
     For Each item In m_ComObjects 
      Marshal.FinalReleaseComObject(item) 
     Next 

     GC.SuppressFinalize(Me) 
    End Sub 

End Class 

Répondre

1

J'aime l'idée d'où vous allez. Je suis plus enclin à envelopper un objet COM que j'utilise dans un type IDisposable, où le type expose les membres publics de l'objet COM (think: Adapter). La méthode Dispose() dans votre classe gérera ensuite la garbage collection de l'objet COM.

Si vous utilisez beaucoup d'objets COM, vous pouvez hériter d'une classe de base pour gérer la mise au rebut. Je n'ai pas testé ce code du tout, mais c'est généralement ce que je pense ...

public abstract class COMAdapter : IDisposable { 

    protected abstract object COMObject { get; } 

    public void Dispose() { 
     Marshal.FinalReleaseComObject(COMObject); 
     GC.SuppressFinalize(this); 
    } 
} 

public class ConcreteAdapter : COMAdapter { 
    private YourCOMType _comObject; 

    protected override object COMObject { 
     get { return _comObject; } 
    } 
} 
+0

J'utiliserais des génériques au lieu de l'héritage pour les types de béton, mais je vois ce que vous voulez dire. –