Подтвердить что ты не робот

Удаление Microsoft.Office.Interop.Word.Application

(Несколько ниже следует из сообщения (которое остается без ответа): https://stackoverflow.com/q/6197829/314661)

Используя следующий код

Application app = new Application();
_Document doc = app.Documents.Open("myDocPath.docx", false, false, false);
doc.PrintOut(false);
doc.Close();

Я пытаюсь открыть и распечатать файл программно.

Проблема заключается в том, что каждый раз, когда я запускаю вышеуказанный код, запускается новый процесс WINWORD.exe, и, очевидно, это быстро поглощает всю память.

Класс приложения, похоже, не содержит метод dispose/close или аналогичный.

После небольшого исследования я (реализовано) и изменил код на следующий.

 Application app = new Application();
 _Document doc = app.Documents.Open(fullFilePath + ".doc", false, false, false);
 doc.PrintOut(false);
 doc.Close();
 int res = System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);
 int res1 = System.Runtime.InteropServices.Marshal.ReleaseComObject(app);

И я вижу, что оставшийся счетчик ссылок равен нулю, но процессы остаются?

PS: Я использую версию 14 библиотеки Microsoft.Office.Interop.

4b9b3361

Ответ 1

Возможно, попробуйте установить doc = null и вызывать GC.Collect()

Редактировать, не совсем мой собственный код. Я забыл, где я его получил, но это то, что я использую для удаления Excel, и это делает работу, возможно, вы можете что-то извлечь из этого:

public void DisposeExcelInstance()
{
    app.DisplayAlerts = false;
    workBook.Close(null, null, null);
    app.Workbooks.Close();
    app.Quit();
    if (workSheet != null)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(workSheet);
    if (workBook != null)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(workBook);
    if (app != null)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
    workSheet = null;
    workBook = null;
    app = null;
    GC.Collect(); // force final cleanup!
}

Ответ 2

Вам не нужно вызывать Quit?

app.Quit();

Ответ 3

Лучшее решение.. последнее:

try {

    Microsoft.Office.Interop.Word.Application appWord = new Microsoft.Office.Interop.Word.Application();
    appWord.Visible = false;
    Microsoft.Office.Interop.Word.Document doc = null;
    wordDocument = appWord.Documents.Open((INP), ReadOnly: true);

    wordDocument.ExportAsFixedFormat(OUTP, Microsoft.Office.Interop.Word.WdExportFormat.wdExportFormatPDF);

    // doc.Close(false); // Close the Word Document.
    appWord.Quit(false); // Close Word Application.
} catch (Exception ex) {
    Console.WriteLine(ex.Message + "     " + ex.InnerException);
}

Ответ 4

Я закрываю документ, а затем приложение, которое работает для меня, затем принудительно собирает мусор.

// Document
object saveOptionsObject = saveDocument ? Word.WdSaveOptions.wdSaveChanges : Word.WdSaveOptions.wdDoNotSaveChanges;
this.WordDocument.Close(ref saveOptionsObject, ref Missing.Value, ref Missing.Value);

// Application
object saveOptionsObject = Word.WdSaveOptions.wdDoNotSaveChanges;
this.WordApplication.Quit(ref saveOptionsObject, ref Missing.Value, ref Missing.Value); 

GC.Collect();
GC.WaitForPendingFinalizers();

Ответ 5

Вам нужно позвонить app.Quit(), чтобы закрыть приложение. Я использовал ниже код, и он работал как прелесть для меня -

try
{
   Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application();
   wordApp.Visible = false;
   Microsoft.Office.Interop.Word.Document doc = null;

   //Your code here...

   doc.Close(false); // Close the Word Document.
   wordApp.Quit(false); // Close Word Application.
}
catch (Exception ex)
{
   MessageBox.Show(ex.Message + "     " + ex.InnerException);
}
finally
{
   // Release all Interop objects.
   if (doc != null)
      System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);
   if (wordApp != null)
      System.Runtime.InteropServices.Marshal.ReleaseComObject(wordApp);
   doc = null;
   wordApp = null;
   GC.Collect();
}