KB0203:如何从托管代码(C#、Visual Basic、.NET)使用 Office 自动化
问题
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)