2010-10-14 10 views

Antwort

22

Es gibt einige Vorteile in FinalReleaseComObject, es wird Ihr Programm schneller zum Absturz bringen. "Das COM-Objekt, das von seinem zugrunde liegenden RCW getrennt wurde, kann nicht verwendet werden" ist die CLR, die Ihnen sagt, dass Sie sich um COM-Referenzen kümmern, anstatt sie zu verwerfen. Die CLR war ein Fehler. Ihre Laufleistung kann variieren, Sie können nicht wirklich darauf vertrauen, dass sie richtig funktioniert, wenn sie auf Ihrer Entwicklungsmaschine funktioniert. Stellen Sie sicher, dass Sie eine gute Fehlerberichterstattung implementieren, wenn Sie den Code auf dem Computer Ihres Kunden bereitstellen.

Die Tugend ist, dass es nur einen Platz in Ihrem Code gibt, wo Sie es falsch verstanden haben, den FinalReleaseComObject Aufruf. Es wird viel unschärfer, wenn Sie ReleaseComObject verwenden. Denn das wird für eine Weile unbemerkt bleiben und Ihr Programm zum Absturz bringen, wenn die CLR das letzte IUnknown::Release() aufruft, das das Objekt zerstört. Sehr weit entfernt von einem falschen ReleaseComObject Anruf. Aber das ist das Szenario des Jüngsten Gerichts, das wahrscheinlichere Ergebnis ist, dass der Anruf nur keinen Unterschied macht, weil Sie die harten verpasst haben. Wie mumble["foo"], eine Indexer-Referenz, die so sehr schwer zu sehen ist.

Nun, mein Rat ist offensichtlich: Tu dies nicht. Sie konkurrieren mit einer Maschine, die nie es falsch macht. Es ist nur ein bisschen langsam dabei. Ein sehr guter "Bericht aus dem wirklichen Leben" ist available here. Der Abschnitt "stiller Attentäter" ist am relevantesten.

Wenn es absolut notwendig ist, einen COM-Server zum sofortigen Beenden zu bringen, dann lassen Sie die Maschine darauf achten, alle Referenzzählungen auf 0 zu setzen. Sie tun dies mit GC.Collect(). Denken Sie jedoch daran, dass Sie diesen Aufruf korrekt platzieren müssen, wenn dies auch beim Debuggen funktionieren soll. Es wird nicht in derselben Methode funktionieren, die die COM-Objekte verwendet, die in this answer erläutert werden. Setzen Sie es stattdessen in die aufrufende Methode.

+2

Schlägst du vor, das Objekt überhaupt nicht freizugeben? –

+2

Ja. Warum denkst du musst du? –

+1

Unser Lieferant hat in seiner Dokumentation angegeben, dass Sie alle Objekte freigeben müssen, nachdem Sie sie verwendet haben. –

Verwandte Themen