Tengo un objeto administrado que llama a un servidor COM para asignar algo de memoria. El objeto administrado debe volver a llamar al servidor COM para liberar esa memoria antes de que el objeto administrado desaparezca para evitar una pérdida de memoria. Este objeto implementa IDisposable
para ayudar a garantizar que se realice la llamada COM de liberación de memoria correcta.¿Es seguro llamar a un RCW desde un finalizador?
En el caso de que el método Dispose
sea no llamado, me gustaría que el finalizador del objeto libere la memoria. El problema es que las reglas de finalización son que no debe acceder a ninguna referencia porque no sabe qué otros objetos ya han sido procesados y/o finalizados antes que usted. Esto deja el único estado de objeto touchable como campos (los identificadores son los más comunes).
Pero llamar a un servidor COM implica pasar por un contenedor invocable en tiempo de ejecución (RCW) para liberar la memoria en la que tengo una cookie almacenada en un campo. ¿Es seguro llamar a RCW desde un finalizador (¿está garantizado que no se ha completado o no el GC en este momento)?
Para aquellos que no estén familiarizados con la finalización, aunque el subproceso finalizador ejecuta en segundo plano de un dominio de aplicación gestionada mientras que su ejecución, en esos casos que tocan referencias teóricamente estar bien, finalización también sucede en el apagado dominio de aplicación, y en cualquier orden - no solo en el orden de relación de referencia. Esto limita lo que puede asumir que es seguro tocar desde su finalizador. Cualquier referencia a un objeto gestionado podría ser "mala" (memoria recopilada) aunque la referencia no sea nula.
actualización: Sólo lo intentó y consiguió esto:
Una excepción no controlada del tipo 'System.Runtime.InteropServices.InvalidComObjectException' producido en MyAssembly.dll
Información adicional: objeto COM que se ha separado de su RCW subyacente no se puede usar.
Un método en el servidor COM (¿por qué alguien llamaría a Dispose en un RCW? Me sorprendería si eso fuera posible). –