KB0203:如何从托管代码(C#、Visual Basic、.NET)使用 Office 自动化

  1. Home
  2. 资源
  3. 知识库
  4. KB0203

问题

Office 使用 COM 公开自动化对象。在 C# 和 Visual Basic 使用的托管代码中,COM 对象会被包装在 Runtime Callable Wrappers (RCW) 中。如果程序员未采取任何特殊操作,被 RCW 包装的 COM 对象只会在垃圾回收时释放;在没有内存压力的情况下,这可能永远不会发生。

解决方案

要以确定性的方式释放 COM 对象,请在使用完从 Office 接收的所有对象后,通过 System.Runtime.InteropServices.Marshal.ReleaseComObject 释放它们。

注意

  • 请勿使用 System.Runtime.InteropServices.Marshal.FinalReleaseComObject,因为即使其他托管加载项仍在使用该 COM 对象,它也会释放该对象。

  • 请勿通过另一个对象访问某个对象,例如:

    // C#
    // 错误
    PowerPoint.View view = Application.ActiveWindow.View;
    ' Visual Basic
    ' 错误
    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)