Wie wird Office Automation mit verwaltetem Code (C#, Visual Basic, .NET) verwendet?
Problem
Office verwendet COM, um Automatisierungsobjekte freizugeben. Im verwalteten Code, wie er von C# und Visual Basic verwendet wird, werden COM-Objekte in Runtime Callable Wrappers (RCWs) gewrappt. Ohne Eingreifen des Programmierers werden COM-Objekte, die in RCWs gewrappt sind, nur bei der Speicherbereinigung wieder freigegeben, was bei fehlendem Speicherdruck möglicherweise nie der Fall ist.
Lösung
Um COM-Objekte ausdrücklich freizugeben, geben Sie alle Objekte, die Sie von Office erhalten, mit System.Runtime.InteropServices.Marshal.ReleaseComObject frei, wenn Sie deren Verwendung abgeschlossen haben.
Hinweis
-
Verwenden Sie nicht System.Runtime.InteropServices.Marshal.FinalReleaseComObject, weil dadurch das COM-Objekt freigegeben wird, auch wenn es noch von anderen verwalteten Add-Ins verwendet wird.
-
Greifen Sie z. B. nicht auf ein Objekt durch ein anderes zu:
// C# // Wrong PowerPoint.View view = Application.ActiveWindow.View;
' Visual Basic ' Wrong Dim view As PowerPoint.View = Application.ActiveWindow.View
In diesem Fall erstellt ActiveWindow ein temporäres PowerPoint.Dokumentfenster, das nicht freigegeben wird.
Weisen Sie es stattdessen einer Variablen zu und geben Sie es frei:
// C# PowerPoint.DocumentWindow wnd = Application.ActiveWindow; PowerPoint.View view = wnd.View; System.Runtime.InteropServices.Marshal.ReleaseComObject(wnd); System.Runtime.InteropServices.Marshal.ReleaseComObject(view);
' Visual Basic Dim wnd As PowerPoint.DocumentWindow = Application.ActiveWindow Dim view As PowerPoint.View = wnd.View System.Runtime.InteropServices.Marshal.ReleaseComObject(wnd) System.Runtime.InteropServices.Marshal.ReleaseComObject(view)