2009-09-03 14 views
5

Esta es una pregunta a continuación How to properly clean up excel interop objects in c#.Cómo limpiar correctamente los objetos de interoperabilidad en C#

El giro es que usar un encadenamiento de llamadas juntas (por ejemplo, ExcelObject.Foo.Bar()) dentro del espacio de nombres de Excel evita la recolección de elementos no utilizados para los objetos COM. En su lugar, uno debe crear explícitamente una referencia a cada objeto COM utilizado, y liberarlos explícitamente usando Marhsal.ReleaseComObject().

¿El comportamiento de no liberar objetos COM después de una llamada encadenada específica para objetos COM de Excel solamente? ¿Es excesivo aplicar este tipo de patrón cada vez que se utiliza un objeto COM?

Respuesta

6

Definitivamente es más importante manejar las versiones correctamente cuando se trata de aplicaciones de Office que muchas otras bibliotecas COM, por dos razones.

  1. Las aplicaciones de Office se ejecutan como servidores fuera de proceso, no como bibliotecas de proceso. Si no limpia correctamente, deja un proceso en ejecución.
  2. Las aplicaciones de Office (especialmente Excel IIRC) no finalizan correctamente incluso si llama a Application.Quit, si hay referencias pendientes a sus objetos COM.

Para las bibliotecas COM in-proc habituales, las consecuencias de no limpiar correctamente no son tan dramáticas. Cuando su proceso finaliza, todas las bibliotecas en proceso se van con él. Y si olvida llamar a ReleaseComObject en un objeto cuando ya no lo necesita, de todos modos se lo atenderá cuando el objeto se finalice.

Dicho esto, esto no es excusa para escribir código descuidado.

+0

Muy buenos puntos RE: por qué debe limpiar los objetos de interoperabilidad de la oficina –

2

Los objetos COM son esencialmente código no administrado, y tan pronto como empiece a llamar a un código no administrado desde una aplicación administrada, será su responsabilidad limpiar después de ese código no administrado.

En resumen, el patrón vinculado en el post anterior es necesario para todos objetos COM.

+0

... para obtener una definición de "necesario". En el cierre del proceso (o la descarga del dominio de la aplicación, si eso ocurre primero), creo que todos los RCW (contenedores invocables en tiempo de ejecución) que aún no se han destruido serán liberados. Desafortunadamente, no hay garantías sólidas en torno a que se destruyan adecuadamente y se ejecuten todos sus finalizadores. Entre otras cosas, si destruir un objeto COM tarda más de 2 segundos, el CLR terminará toda la cola de finalizadores que se ejecutan en ese hilo. – reuben

+2

@Reuben, lea la pregunta, la respuesta es 100% correcta con respecto a la pregunta que se hace, sin embargo, los detalles intrínsecos acerca de COM no tienen nada que ver con esta pregunta. –

Cuestiones relacionadas