2012-05-10 18 views
13

Estoy desarrollando una aplicación que depende en gran medida de varios productos de Microsoft Office, incluidos Access, Excel, Word, PowerPoint y Outlook, entre otros. Mientras hacía investigación sobre interoperabilidad descubrí que comenzando con VS2010 y .NET 4, afortunadamente ya no tenemos que pasar por las pesadillas de los PIA.Eliminación correcta de objetos de interoperabilidad COM en C# particularmente aplicaciones de MS Office

Además, he estado leyendo muchos artículos sobre la eliminación adecuada de objetos, el más sensato parecía ser this uno.

Sin embargo, el artículo tiene 5 años y no hay muchas publicaciones autorizadas sobre el tema AFAIK. Este es un ejemplo de código desde el enlace de arriba:

' Cleanup: 
GC.Collect() 
GC.WaitForPendingFinalizers() 
GC.Collect() 
GC.WaitForPendingFinalizers() 

Marshal.FinalReleaseComObject(worksheet) 

oWB.Close(SaveChanges:=False) 
Marshal.FinalReleaseComObject(workbook) 

oApp.Quit() 
Marshal.FinalReleaseComObject(application) 

Lo que yo quiero saber es para los estándares de hoy en día, cómo es exacto es esto y qué debo mirar hacia fuera para si espero para apoyar mi solicitud para los próximos ¿años?

ACTUALIZACIÓN: Un enlace a algunos artículos creíbles sería muy apreciado. Por cierto, esta no es una aplicación del lado del servidor. Esto se ejecutará en los laboratorios de computación donde los usuarios interactúan con los productos de oficina que creamos para ellos.

ENCONTRÓ IT:This artículo de tres partes es probablemente el más cercano a una cuenta autorizada que esperaría encontrar.

+0

¿Por qué necesita liberar los objetos mientras se ejecuta su aplicación? La aplicación de Office se cerrará cuando finalice su aplicación. – adrianm

+1

Sí, soy consciente de que se realizará un GC correcto después de la descarga del dominio de la aplicación. Sin embargo, mi escenario es niehter una aplicación del lado del servidor ni una aplicación de cliente única. Es un poco una mezcla donde necesito asegurarme de que las instancias abiertas se hayan cerrado correctamente antes de acomodar al siguiente usuario. –

+1

Sobre un tema similar: http://stackoverflow.com/questions/158706/how-to-properly-clean-up-excel-interop-objects/159419#159419 – rkagerer

Respuesta

2

Dependiendo de la versión de Office que controle a través de la interoperabilidad, y de las circunstancias que ocurren en el servidor, sí, puede que tenga que hacer algunas complicaciones graves para deshacerse de una instancia en ejecución de una de las aplicaciones de Office. Hay diálogos impredecibles (e innecesarios) que, por ejemplo, Word abrirá cuando no sea interactivo (ninguna de las aplicaciones de Office está especialmente bien diseñada para la ejecución desatendida, por lo que se recomienda que incluso con las últimas versiones no se instalen). uso del lado del servidor).

Para casos de servidor, considere utilizar la pila de Aspose en lugar de Office u otra de las alternativas. En los casos de uso local interactivo, es posible que necesite esa "muerte vigorosa adicional" en ocasiones, ya que los servidores de automatización de Office son objetos no administrados que se comportan especialmente mal.

3

Los objetos deben ser eliminados automáticamente por el GC después de que el objeto salga del alcance. Si necesita liberarlos antes, puede usar Marshal.ReleaseComObject http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.releasecomobject.aspx

+3

http://blogs.msdn.com/b/visualstudio/archive/2010/03/01/marshal-releasecomobject-considered-dangerous.aspx –

+0

Impresionante, no hay mención de esa belleza en los documentos de ReleaseComObject ... –

2

Si desea liberar objetos COM completamente, especialmente en objetos COM de MS Office, es muy recomendable que libere subobjetos que debe haber utilizado que se encuentran dentro de los objetos principales.

En su ejemplo, yo diría liberar todas las celdas, rango de cualquier otro objeto que haya utilizado antes de liberar la hoja de cálculo a la que pertenece la celda, el rango o cualquier otro objeto.

Cuestiones relacionadas