C # .Net4: Korrekte Entsorgung von (dynamischen) COM-Objekten

8

Ich muss Office-Dokumente (Word und Excel) aus meiner .Net4-App automatisieren.

Da ich meine Benutzer nicht wirklich zwingen kann, eine bestimmte Office-Version zu verwenden, verwende ich keine Interop-Assemblys oder tlbimp, daher enthält mein Projekt keine zusätzlichen Referenzen, und die gesamte App schlägt fehl, wenn Office nicht installiert ist ( Funktion wird nicht verfügbar sein.)

Stattdessen frage ich das System, welcher COM-Server "Word.Application" oder "Excel.Application" verarbeiten kann:

%Vor%

Ich bin besorgt, wie ich das "App" -Objekt richtig entsorgen kann, wenn ich damit fertig bin, da ich jetzt zwei interne Managementsysteme habe, um die ich mich kümmern muss (COM-Referenzzählung und .Net-Referenzverfolgung). Idealerweise sollte ich in der Lage sein, das dynamische App-Objekt in eine Wrapper-Einmalklasse einzubinden und sicher zu sein, dass das zugrundeliegende COM-Objekt nicht referenziert wird, wenn der Wrapper entsorgt wird.

EDIT: Außerdem würde ich gerne wissen, wie man das COM-Objekt "live" macht, wenn ich damit fertig bin, da Word in einem separaten Prozess ist. Ich sollte in der Lage sein Word App zu instanziieren, zu automatisieren und dann alle meine Referenzen freizugeben, aber die Word App sollte offen bleiben.

    
Boris B. 28.02.2011, 10:25
quelle

1 Antwort

7

Ich würde definitiv IDisposable implementieren und Marshal.ReleaseComObject darin nennen. Stellen Sie sicher, dass Sie das Wegwerfmuster korrekt implementieren , um die Freigabe der COM zu vermeiden Objekt mehr als einmal und die Anzahl der Referenzen weiter reduzieren, als Sie sollten, obwohl dies nicht wichtig ist, wenn Sie nur eine Instanz des COM-Objekts erstellen. Ich habe dieses Muster in der Vergangenheit erfolgreich umgesetzt, so dass Sie definitiv in die richtige Richtung gehen.

Ich denke Word bleibt geöffnet, auch wenn das letzte COM-Objekt in Ihrer App auf 0 gezählt wird, es sei denn, Sie werden explizit aufgefordert, es zu beenden. ( Word.Application.Close() ?)

    
James Webster 28.02.2011, 10:33
quelle

Tags und Links