KB0203: Verwendung von Office Automation aus verwaltetem Code (C#, Visual Basic, .NET)
- Startseite
- Ressourcen
- Knowledge Base
- KB0203
Problem
Office verwendet COM, um Automatisierungsobjekte bereitzustellen. In verwaltetem Code, wie er von C# und Visual Basic verwendet wird, werden die COM-Objekte in Runtime Callable Wrappers (RCWs) gekapselt. Ohne besondere Maßnahmen durch den Programmierer werden in RCWs gekapselte COM-Objekte erst bei der Garbage Collection freigegeben, was ohne Speicherdruck möglicherweise nie geschieht.
Lösung
Um COM-Objekte deterministisch freizugeben, geben Sie alle Objekte, die Sie von Office erhalten, nach deren Verwendung mit System.Runtime.InteropServices.Marshal.ReleaseComObject frei.
Hinweis
-
Verwenden Sie nicht System.Runtime.InteropServices.Marshal.FinalReleaseComObject, da dadurch das COM-Objekt freigegeben wird, selbst wenn andere verwaltete Add-ins es noch verwenden.
-
Greifen Sie nicht über ein anderes Objekt auf ein Objekt zu, z. B.:
// C# // Falsch PowerPoint.View view = Application.ActiveWindow.View;' Visual Basic ' Falsch Dim view As PowerPoint.View = Application.ActiveWindow.ViewIn diesem Fall erstellt ActiveWindow ein temporäres PowerPoint.DocumentWindow, 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)