知识库 KB0203

如何通过托管代码(C#、Visual Basic、.NET)使用 Office Automation

问题

Office 使用 COM 揭示 Automation 对象。在托管代码中,与 C# 和 Visual Basic 使用的情况相同,会在运行时可调用包装器 (RCW) 中包装 COM 对象。若程序员未采取任何特殊操作,则只会在垃圾回收上释放 RCW 中包装的 COM 对象,永远也不会出现缺少内存压力的情况。

解决方案

若要确切地释放 COM 对象,请在使用结束后,释放使用 System.Runtime.InteropServices.Marshal.ReleaseComObject 从 Office 接收的所有对象。

注释

  • 请勿使用 System.Runtime.InteropServices.Marshal.FinalReleaseComObject,因为即使有其他托管加载项仍在使用 COM 对象,它也会释放 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)

分享