Knowledge-Base-Artikel (KB0203)

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)