c# - manipular - Eliminando Microsoft.Office.Interop.Word.Application



microsoft.office.interop.excel visual studio 2017 (4)

¿No necesita llamar a Quit ?

app.Quit();

(Algo así como un seguimiento de la publicación (que sigue sin respuesta): https://stackoverflow.com/q/6197829/314661 )

Usando el siguiente código

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

Estoy intentando abrir e imprimir un archivo mediante programación.

El problema es que cada vez que ejecuto el código anterior, se inicia un nuevo proceso WINWORD.exe y, obviamente, esto rápidamente consume toda la memoria.

La clase de aplicación no parece contener un método de eliminación / cierre o similar.

Después de investigar un poco, me di cuenta y cambié el código a lo siguiente.

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

Y puedo ver que el recuento de referencia restante es cero, pero los procesos permanecen?

PD: estoy usando la versión 14 de la biblioteca Microsoft.Office.Interop.


Answer #1

Cierro el documento, luego la aplicación, que funciona para mí y luego fuerzo la recolección de basura.

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

Answer #2

Necesita hacer una llamada a la aplicación.Quit app.Quit() para cerrar la aplicación. Usé el código a continuación y funcionó como un encanto para mí -

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

Answer #3

Prueba esto..

doc.Close(false);
app.Quit(false);
if (doc != null)
    System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);
if (app != null)
    System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
doc = null;
app = null;
GC.Collect();




office-interop