1

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

我目前正在使用这个:

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

3 回答 3

3

确保 Interop 对象被正确释放的最积极的方法是使用双Collect-<code>WaitForPendingFinalizers 模式,改编自Releasing COM Objects

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

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

于 2012-06-09T19:18:42.067 回答
3

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

        // 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;

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

于 2015-03-05T10:45:13.273 回答
-1

来自 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-01-14T05:11:58.307 回答