我遇到了经典场景,在 .NET 中(通过 Microsoft.Office.Interop.Word 程序集)创建 Word COM 对象时,即使我正确关闭和释放对象,WinWord 进程也不会退出。
我已将其缩小到使用 Word.Documents.Add() 方法。我可以以其他方式使用 Word 而不会出现问题(打开文档、修改内容等),当我告诉它时 WinWord.exe 会退出。一旦我使用 Add() 方法(并且仅在添加模板时),该进程就会继续运行。
这是一个重现问题的简单示例:
Dim word As New Word.Application()
word.Visible = False
Dim documents As Word.Documents = word.Documents
Dim doc As Word.Document = documents.Add(Template:=CObj(templatePath), NewTemplate:=False, DocumentType:=Word.WdNewDocumentType.wdNewBlankDocument, Visible:=False)
'' dispose objects
doc.Close()
While (Marshal.ReleaseComObject(doc) <> 0)
End While
doc = Nothing
While (Marshal.ReleaseComObject(documents) <> 0)
End While
documents = Nothing
word.Quit()
While (Marshal.ReleaseComObject(word) <> 0)
End While
word = Nothing
GC.Collect()
正如您所看到的,我正在正确地创建和处理对象,甚至采取了额外的步骤来循环 Marsha.ReleaseComObject 直到它返回正确的代码。在其他方面使用 Word 对象很好,只是讨厌的 Documents.Add 让我很伤心。在这个过程中是否有另一个我需要引用和处理的对象?我还需要遵循其他处置步骤吗?还有什么?非常感谢您的帮助 :)
Update:
我在处置步骤结束时尝试了 GC.Collect,但仍然没有运气。
Update 2:
我已将问题缩小到使用自定义模板。当我调用 Documents.Add(...) 时,我为新文档指定了一个自定义模板。如果我不这样做,而是在没有参数的情况下调用 Add(),那么问题就不会发生。