知识库 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)