2011-07-21 22 views
32

(algo así como un seguimiento sobre del poste (que sigue sin respuesta): https://stackoverflow.com/q/6197829/314661)Eliminación de Microsoft.Office.Interop.Word.Application

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 un poco de investigación I (realicé) 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.

Respuesta

33

Tal vez intente establecer doc = null y llamando GC.Collect()

Editar, no es realmente mi propio código no recuerdo dónde lo saqué, pero esto es lo que yo uso para disponer de Excel y hace el trabajo tal vez se puede deducir algo de esto:

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! 
} 
+0

No es mala idea. Pero lo intenté y no pareció ayudar. –

+10

Absolute legand. App.Quit() fue la clave ... ¡Gracias! –

+0

Este es un ejemplo de Excel. – gangelo

0

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(); 
+1

No hay necesidad de 'GC.Collect()' ni 'Marshal.ReleaseComObject()' si cierra el documento y sale de la aplicación – MickyD

0

Necesita llamar app.Quit() para cerrar la aplicación. Solía ​​continuación código & 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(); 
} 
+3

Es extraño cómo funcionó para usted porque su código debería dar error de compilación, ya que doc y wordApp se crea dentro de try y no estará disponible finalmente. – Unnie

+0

No es necesario 'GC.Collect()' ni 'Marshal.ReleaseComObject()' si cierra el documento y sale de la aplicación – MickyD

2

La mejor solución .. última:

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