2009-05-14 9 views
0

Ich habe eine COM-Komponente in nicht verwaltetem C++ geschrieben, um Kunden Zugriff auf unsere Datenbank zu ermöglichen. Bei Verwendung einer nicht verwalteten Sprache werden die Datenbankverbindungen korrekt bereinigt, da die Objekte den Gültigkeitsbereich verlassen. Ich habe vor kurzem versucht, es aus VB.NET zu verwenden und festgestellt, dass die COM-Objekte nicht zerstört werden. Streuung Aufrufe an System.Runtime.InteropServices.Marshal.ReleaseComObject behebt das Problem, aber ich möchte eine einfachere und Ausnahme sichere Lösung finden, da dieses COM-Objekt für den Kunden gedacht ist.So implementieren Sie Dispose in einem COM-Objekt

Es scheint, dass die richtige Lösung die verwalteten Objekte implementieren IDisposeable so die mit Anweisung haben, ist automatisch verwendet werden können, Entsorgen aufrufen, wenn das Objekt nicht erforderlich ist, länger.

Wie gehe ich bei der Implementierung von IDisposeable für eine Teilmenge meiner Objekte vor? Einige der Objekte, die entsorgt werden müssen, sind nicht kopierbar, werden aber von anderen Funktionen zurückgegeben.

+0

Vielleicht ist meine Antwort auf diese Frage (http://stackoverflow.com/questions/158706/how-to-properly-clean-up-excel-interop -Objekte-in-c/158752 # 158752) hilft bei Ihrem spezifischen Fall. – VVS

Antwort

2

Wahnsinn liegt so. Sie sollten besser Ihre COM-Objekte in typsichere .Net-Wrapper verpacken, die IDisposable implementieren (wenn Sie möchten), oder die normalen Methoden der .Net-Garbage-Collection verwenden, um sich selbst zu bereinigen.

+0

Gibt es eine bessere Möglichkeit, um sicherzustellen, dass die Datenbankverbindungen geschlossen sind, als IDisposable zu verwenden? Ich würde wirklich gerne sicherstellen, dass alle COM-Objekte aufgeräumt sind, da es momentan einen Absturz beim Beenden gibt, wenn meine Caches in der COM-Komponente in DllMain zerstört werden. Wenn die COM-Objekte freigegeben würden, wären die Caches leer. –

2

Sie mit den .NET-Wrapper gehen könnte wie 1800 INFORMATION schon sagt, dann denken Sie daran, sie immer mit einer using-Anweisung verwenden, wie Sie gesagt haben:

using(var connection = GetDisposableConnection()) 
{ 
    //do stuff 
} 

Wenn dies nicht, weil etwas nicht funktioniert, wurde korrekt freigegeben, können Sie diese Zeilen einfügen, wenn das herunter~~POS=TRUNC:

GC.Collect(); 
GC.WaitForPendingFinalizers(); 
GC.Collect(); 
+0

Danke für den Hinweis, dass ich WaitForPendingFinalizers angerufen habe. –

+0

Kein Problem - froh, geholfen zu haben. – Ant

Verwandte Themen