Using Word COM objects in .NET, WinWord process won’t quit after calling Word.Documents.Add

There are a few important things here:

1) Never use 2 dots on the same line. Also consider an indexer as a dot

Good

Word.Documents d = wordApp.Documents; 
Word.Document aDoc = d.Open(/*...*/); 

BAD

Word.Document aDoc = wordApp.Documents.Open(/*...*/); 

2) Release all of your pointers.

3) No really, go back and release all of your pointers, you missed one somewhere (or at least I always do).

Here’s a full example of what FINALLY worked for me on one project after much wailing and gnashing of teeth:

object m = Missing.Value; 
// this must be an object, not a string. if you forget though, 
// intellisense will remind you 
object oFilename = @"C:my sheet.doc"; 
 
object readOnly = false; 
object isVisible = false; 
 
Word.Application wordApp = new Word.ApplicationClass(); 
wordApp
.Visible = false; 
// remember: don't use 2 dots on 1 line 
Word.Documents d = wordApp.Documents; 
Word.Document aDoc = d.Open(ref oFilename, ref m, ref readOnly, ref m, 
   
ref m, ref m, ref m, ref m, ref m, ref m, ref m, ref isVisible, 
   
ref m, ref m, ref m, ref m); 
aDoc
.Activate(); 
 
object findText = "my old value"; 
object replaceText = "new and improved value"; 
 
object oTrue = true; 
object oFalse = false; 
object replace = 2; 
object wrap = 1; 
 
Word.Selection s = wordApp.Selection; 
Word.Find f = s.Find; 
f
.Execute(ref findText, ref oTrue, 
   
ref oTrue, ref oFalse, ref oFalse, 
   
ref oFalse, ref oTrue, ref wrap, ref oFalse, 
   
ref replaceText, ref replace, ref oFalse, ref oFalse, 
   
ref oFalse, ref oFalse); 
 
aDoc
.SaveAs(ref oFilename, ref m, ref m, ref m, ref m, ref m, ref m, 
   
ref m, ref m, ref m, ref m, ref m, ref m, ref m, ref m, ref m); 
 
object doNotSaveChanges = Word.WdSaveOptions.wdDoNotSaveChanges; 
// casting here because intellisense complained of ambiguity 
(aDoc as Word._Document).Close(ref doNotSaveChanges, ref m, ref m); 
 
// release each in the reverse of the order in which it was first used 
// ReleaseComObject might also work as well. I haven't tested yet 
Marshal.FinalReleaseComObject(f); 
Marshal.FinalReleaseComObject(s); 
Marshal.FinalReleaseComObject(aDoc); 
Marshal.FinalReleaseComObject(d); 
 
// must quit app before releasing 
// again: casting because intellisense complained of ambiguity 
(wordApp as Word._Application).Quit(ref m, ref m, ref m); 
Marshal.FinalReleaseComObject(wordApp); 

引文来源  Using Word COM objects in .NET, WinWord process won’t quit after calling Word.Documents.Add – Stack Overflow