`

使用 Visual Studio .NET 客户端执行自动化功能后不退出 Office 应用程序

 
阅读更多

使用 Microsoft Visual Basic .NET 或 Microsoft Visual C# .NET 使 Microsoft Office 应用程序执行自动化功能后,当调用 Quit 方法时,不退出 Office 应用程序。

当 Visual Studio .NET 从托管代码调用 COM 对象时,它自动创建运行库可调用包装 (RCW)。RCW 封送 .NET 应用程序和 COM 对象之间的调用。RCW 保留着对 COM 对象的引用计数。因此,如果 RCW 上没有将所有引用全部释放,COM 对象就不会退出。

要确保退出 Office 应用程序,自动化代码一定要满足以下条件:

  • 将每个对象声明为新变量。例如,将下面的代码行
    oBook = oExcel.Workbooks.Add()
    					
    更改为以下内容:
    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    					
  • 停止使用某个对象时,应使用 System.Runtime.InteropServices.Marshal.ReleaseComObject。这样可以减少 RCW 的引用计数。
  • 要释放对变量的引用,请将变量设置为等于 NothingNull
  • 使用 Office 应用程序对象的 Quit 方法通知服务器关闭。

重现问题的步骤

请注意,如果您按照“重现此问题的步骤”一节中的说明执行操作后,服务器仍然没有关闭,则在您释放最后一个对象后,可以使用 GC.Collect()GC.WaitForPendingFinalizers() 方法。因为运行库对 RCW 执行垃圾收集,所以 GC.Collect() 方法会强制垃圾回收器运行,并且会释放 RCW 仍然拥有的任何引用。GC.Collect() 方法尝试回收可用的最大内存。注意,这不能保证所有内存都被回收。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics