.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()を呼び出すと、問題は発生しません。