【问题标题】:How to "free" an Microsoft.Office.Interop.Word.Application wordApp instance?如何“释放” Microsoft.Office.Interop.Word.Application wordApp 实例?
【发布时间】:2012-06-13 09:14:35
【问题描述】:

“释放”这个对象的替代方法是什么?它通常在调用.Exit() 方法时发生,但在这种情况下,我不能这样做,因为用户应该关闭单词应用程序实例。我想做wordApp = null 或致电GC.Collect(); 什么是最好的解决方案,为什么?提前致谢。

我目前正在使用这个:

   public static void Free()
    {
        if (wordApp != null)
        {
            System.Runtime.InteropServices.Marshal.ReleaseComObject(wordApp);
            GC.Collect();
        }
    }

【问题讨论】:

  • 设置为空。执行 marshal.releasecomobject 并调用 GC.collect

标签: c# memory-management garbage-collection


【解决方案1】:

确保正确释放 Interop 对象的最激进的方法是使用双 CollectWaitForPendingFinalizers 模式,改编自 Releasing COM Objects

Marshal.ReleaseComObject(wordApp);
wordApp = null;
GC.Collect(); 
GC.WaitForPendingFinalizers(); 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 

在托管世界和非托管世界之间需要特别小心的一个互操作领域是在完成 COM 对象后干净地释放它们。在前面的示例中,我们设法使用标准垃圾收集实现了我们想要的所有行为。唯一的轻微改进是调用GC.Collect 两次,以确保在第二次扫描时收集所有可用于收集但在第一次扫描中幸存下来的内存。

【讨论】:

  • 在没有设置 wordApp.Quit(saveOption) 的情况下,它还没有从正在运行的进程中释放出来,你必须将保存选项设置为 true 或 false,我将它设置为 false 并像魅力一样工作。
【解决方案2】:

一个不那么激进的方法是这样的

        // Make sure to exit app first
        object saveOption = Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges;
        object originalFormat = Microsoft.Office.Interop.Word.WdOriginalFormat.wdOriginalDocumentFormat;
        object routeDocument = false;

        ((_Application)wordApp).Quit(ref saveOption, ref originalFormat, ref routeDocument);

        if (wordApp!= null)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(wordApp);

        // Set to null
        wordApp= null;

但请确保所有文档都已关闭或关闭并保存!

【讨论】:

    【解决方案3】:

    From MSDN

    要解决 ReleaseComObject 返回值大于零的情况,可以在循环中调用该方法,执行 ReleaseComObject 直到返回值为零:

    Dim wrd As New Microsoft.Office.Interop.Word.Application
    Dim intRefCount As Integer
    Do 
      intRefCount = System.Runtime.InteropServices.Marshal.ReleaseComObject(wrd)
    Loop While intRefCount > 0
    wrd = Nothing
    

    【讨论】:

      猜你喜欢
      • 2017-04-22
      • 2012-02-17
      • 1970-01-01
      • 2011-05-03
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      相关资源
      最近更新 更多