KB0203: Verwendung von Office Automation aus verwaltetem Code (C#, Visual Basic, .NET)

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.View

    In 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)