База знаний KB0203

Как использовать службы автоматизации Office из управляемого кода (C#, Visual Basic, .NET)

Проблема

В Office используется технология COM для предоставления объектов автоматизации. В управляемом коде, например написанном на C# и Visual Basic, COM-объекты обертываются в вызываемые оболочки времени выполнения (RCW). Без специального действия со стороны программиста COM-объекты, обернутые в RCW, освобождаются только механизмом сборки мусора, который может и не запуститься, если нет большой потребности в свободной памяти.

Решение

Для детерминированного освобождения COM-объектов, освободите все ненужные больше объекты, полученные от Office, методом System.Runtime.InteropServices.Marshal.ReleaseComObject.

Примечание

  • Не используйте метод System.Runtime.InteropServices.Marshal.FinalReleaseComObject, поскольку это освободит COM-объект, даже если его еще используют другие управляемые надстройки.

  • Не обращайтесь к объекту посредством другого объекта, например:

    // C#
    // Wrong
    PowerPoint.View view = Application.ActiveWindow.View;
    ' Visual Basic
    ' Wrong
    Dim view As PowerPoint.View = Application.ActiveWindow.View

    В таком случае ActiveWindow создает временное PowerPoint.DocumentWindow, которое не будет освобождено.

    Взамен, назначьте его переменной и освободите ее:

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

Поделиться