Я столкнулся с классическим сценарием, когда при создании объектов Word COM в .NET(через сборку Microsoft.Office.Interop.Word) процесс 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() без параметров, проблема не возникает.