Wann muss ReleaseComObject aufgerufen werden?

8

In einem Microsoft Office AddIn werden COM-Objekte in Ereignissen übergeben. Um einen bestimmten Fall zu berücksichtigen, wenn Word ein Dokument öffnet, werden wir aufgerufen und ein Document-Objekt übergeben. Wann müssen wir dann Marshal.ReleaseComObject () anrufen?

  1. Wenn wir auf das Document-Objekt zugreifen, müssen wir das Release aufrufen? Oder können wir annehmen, dass Word bereits darauf zugegriffen hat und es aufräumen wird?
  2. Wenn wir auf Document.Name zugreifen, erhalten wir eine Zeichenfolge. Da eine Zeichenfolge kein COM-Objekt ist, müssen wir das nicht bereinigen - richtig?
  3. Aber wenn wir auf ein Member zugreifen, das eine Klasse zurückgibt, die ein COM-Objekt umhüllt (das ist eine Klasse, die von einer Member-Methode / Funktion zurückgegeben wird), müssen wir die Freigabe aufrufen - richtig?

Und was passiert, wenn wir eine Veröffentlichung verpassen? Irgendein COM-Objekt, das wir für eine unbestimmte Zeit halten, wickeln wir in eine Klasse von uns mit IDisposable implementiert ab. Wir rufen Dispose () auf, wenn wir fertig sind. Aber ein Teil des Codes, der damit umgeht, ist komplex und ich vermute, wir haben gelegentlich einen Fall, in dem wir nicht Dispose anrufen.

Sind wir besser dran, einen Finalizer zu haben, der dann für jede einzelne Instanz dieser Objekte Overhead (viel!) hinzufügt? Oder sind wir besser dran mit einer kleinen Anzahl von Word-COM-Objekten, die niemals freigegeben werden?

danke - dave

    
David Thielen 06.05.2012, 18:22
quelle

1 Antwort

3

Kurz gesagt, muss jeder Verweis auf ein COM-Objekt freigegeben werden . Wenn Sie dies nicht tun, bleibt der Prozess im Speicher.

Das schließt -Werttypen (Zeichenfolgen usw.) und untergeordnete COM-Objekte aus, auf die Sie nicht explizit verwiesen haben.

Eine Ausnahme können COM-Objekte sein, die Ihnen als Ereignisparameter übergeben werden. Ich glaube nicht, dass du sie veröffentlichen musst, aber ich bin mir nicht sicher. Ein kurzer Test sollte dies jedoch bestätigen. (Versuchen Sie Ihr Add-In mit und ohne das COM-Objekt freizugeben. Sehen Sie, ob das Add-In anfängt, sich lustig zu verhalten, oder ob verwandte Prozesse ausgeführt werden, nachdem die App geschlossen wurde.)

Um Ihre spezifischen Fragen zu beantworten:

  1. Wenn wir auf das Document-Objekt zugreifen, müssen wir das Release aufrufen? Oder können wir annehmen, dass Word bereits darauf zugegriffen hat und es aufräumt? - Sie müssen es freigeben.

  2. Wenn wir auf Document.Name zugreifen, erhalten wir eine Zeichenfolge. Da eine Zeichenfolge kein COM-Objekt ist, müssen wir das nicht bereinigen - richtig? - Sie müssen Werttypen nicht bereinigen.

  3. Aber wenn wir auf ein Member zugreifen, das eine Klasse zurückgibt, die ein COM-Objekt umhüllt (das ist eine Klasse, die von einer Member-Methode / Funktion zurückgegeben wird), müssen wir die Freigabe aufrufen - richtig? - Sie müssen es nicht freigeben, wenn Sie nicht explizit darauf verwiesen haben. (Es gibt einige Ausnahmen. Zum Beispiel in dieser Frage von mir entdeckte ich, dass eine bestimmte COM-Methode ein COM-Objekt instanziiert und Da ich keine Kontrolle über die Methodenimplementierung habe, war meine einzige Wahl, die Methode zu vermeiden.)

  4. Und was passiert, wenn wir eine Veröffentlichung verpassen? - Der Prozess (winword.exe, excel.exe usw.) bleibt im Speicher. Im Laufe der Zeit werden alle diese nicht abgeschlossene Prozesse den gesamten verfügbaren Speicher auf der Maschine auffressen.

  5. Ist es besser, einen Finalizer zu haben, der dann für jede einzelne Instanz dieser Objekte einen Overhead hinzufügt (viel!)? Oder sind wir besser dran mit einer kleinen Anzahl von Word-COM-Objekten, die nie veröffentlicht werden? - Sie sind besser mit dem Finalizer. Geben Sie immer Ihre COM-Objekte frei! Ich habe festgestellt, dass die hier beschriebenen Schritte hier am effektivsten sind. (Diese Schritte verwenden FinalReleaseComObject, das gegenüber ReleaseComObject bevorzugt wird.) Ich rate auch davon ab, den Office-Prozess als Alternative zur Nichtfreigabe von COM zu beenden. Im Laufe der Zeit wird dies Probleme mit der Office-Interop (die ich nie vollständig verstanden habe) verursachen.

Keith 07.05.2012, 15:38
quelle

Tags und Links