Frage

Ist es wirklich notwendig, COM-Komponenten von Office-PIA zu lösen, wenn Sie sie nicht mehr benötigen durch den Aufruf Marshal.ReleaseComObject (..)?

fand ich verschiedene und widersprüchliche Ratschläge zu diesem Thema im Internet. Meiner Meinung nach ist immer da Outlook PIA ist eine neue Verweise auf seine Schnittstellen als Rückgabe von Werten aus ihren Methoden zurückkehren, ist es nicht notwendig, es explizit freigeben. Habe ich Recht?

War es hilfreich?

Lösung

Mit Microsoft Office in der Regel brauchen Sie ausdrücklich Ihre Referenzen zu veröffentlichen, die sicher in zwei Stufen durchgeführt werden können:

(1) Lösen Sie alle kleineren Objekt, auf das Sie nicht eine benannte Objektvariable über einen Aufruf GC.Collect () halten und dann GC.WaitForPendingFinalizers (). (Sie müssen dies zweimal anrufen, wenn die beteiligten Objekte Finalizers, wie bei der Verwendung von Visual Studio Tools for Office (VSTO) haben könnte.)

(2) Lassen Sie dann explizit die Objekte, auf denen Sie eine benannte Variable über einen Aufruf Marshall.FinalReleaseComObject () auf jedes Objekt halten.

Das ist es. : -)

Ich besprach dies genauer in einem früheren Post , zusammen mit einem Codebeispiel.

Andere Tipps

PIAs sind .NET-Interop-Wrapper. Das bedeutet, dass in dem destructor Objekt (oder entsorgen - ich kann mich nicht erinnere) wird automatisch den Referenzzähler behandeln. Der Trick besteht darin, dass einige Verweise nicht, bis der Garbage Collector ausgeführt wird, freigegeben werden. Es hängt davon ab, was das COM-Objekt instanziiert. Zum Beispiel kann ein COM-Objekt, die Datenbank-Cursor öffnet wird diese Cursor lebendig in Erinnerung behalten, bis der Referenzzähler auf diesen Cursor freigegeben wird. Mit dem .NET / COM-Interop, werden die Referenzen nicht freigegeben, bis der Garbage Collector ausgeführt wird oder Sie explizit die Referenz freigeben mit Marshal.ReleaseComObject (oder FinalReleaseComObject).

Ich habe persönlich nicht mit dem Microsoft Office-PIAs gearbeitet, aber in den meisten Fällen sollten Sie nicht Haben , um explizit die Verweise freigeben. Es ist nur, wenn die Anwendung startet andere Ressourcen oder Absturz zu sperren, die Sie sollten verdächtig über dangling references starten.

EDIT: Wenn Sie in eine Situation kommen, wo Sie COM Bereinigung benötigen tun / Interop-Objekte, verwenden Marshal.FinalReleaseComObject - die die Referenz zählen den ganzen Weg statt durch eine von nur Erniedrigen auf Null nimmt - und die Objektreferenz auf null gesetzt. Sie können explizit Garbage Collection erzwingen (GC.Collect), wenn Sie wirklich wollen, sicher sein, aber zu tun GC oft vorsichtig sein, da es einen spürbaren Leistungseinbußen funktioniert aufrufen.

Für VS 2010 finden Sie unter Marshal.ReleaseComObject Ist als gefährlich .

Es gibt einige gute Praktiken hier ein verwaltetes wrapper..worth mit Check-out ..

Vielleicht ist es nur mein Aberglaube, aber ich beschloss, ausdrücklich den Office-PIA über Marshal.ReleaseComObject freizugeben (), weil, wenn meine Anwendung abgestürzt ist, wurden die Verweise auf Excel und Word geöffnet bleiben. Ich habe nicht zu tief graben sich in warum (dumme Fristen), aber sie als Teil meiner Klasse dispose Muster festgelegt, dieses Problem freigegeben wird.

Sie müssen so tun, wenn Sie die Instanz der Office-Anwendung verlassen wollen, wie in dieser Beitrag .

Und es ist schwierig, es richtig, aber die einfachsten Szenarien in alle zu erhalten.

Es gibt eine einfache Regel über .Net / COM-Interop - Im Zweifelsfall immer Release (). : -)

Meine Erfahrung zeigt, dass Sie zu haben, sonst (mindestens Outlook) die Anwendung überhaupt nicht herunterfahren kann.

Aber dies eröffnet eine weitere Dose Würmer, wie es sieht aus wie die RCWs pro Prozess ist, so können Sie eine andere AddIn brechen, die einen Verweis auf das gleiche Objekt haben, geschieht.

Ich habe eine ähnliche Frage hier gepostet , aber ich habe immer noch keine klare Antwort. Ich werde diesen Beitrag bearbeiten, sobald ich mehr weiß.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top