WinWord.exe won't quit after calling Word.Documents.Add - Word .NET Interop

后端 未结 13 1816
没有蜡笔的小新
没有蜡笔的小新 2020-11-30 06:27

I\'m running into the classic scenario where, when creating Word COM objects in .NET (via the Microsoft.Office.Interop.Word assembly), the WinWord process won\'t exit even t

13条回答
  •  爱一瞬间的悲伤
    2020-11-30 07:30

    (All of my advice is adapted from this answer about Excel interop.)

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

提交回复
热议问题