El objeto COM que se ha separado de su RCW subyacente no se puede usar

Tengo un componente COM que llamo desde algunos c # dll.

También tengo una aplicación de winforms que usa ese .dll.

Cuando cierro la aplicación obtengo esta excepción:

El objeto COM que se ha separado de su RCW subyacente no se puede usar.

El seguimiento de stack muestra que esta excepción proviene de un destructor en .dll. Implementé este destructor para llamar a algún método de limpieza en el COM.

¿Por qué pasó esto? ¿Cómo es mejor resolverlo?

El problema se describe aquí:

¿Es seguro llamar a un RCW desde un finalizador?

y aquí:

Liberar objeto de Excel en My Destructor

El problema es que no solo es incierto el momento en que estos objetos serán recogidos basura, sino también el orden en que se llaman a los finalizadores. En este caso, un Contenedor invocable en tiempo de ejecución también tiene un finalizador, que llama a Marshal.FinalReleaseComObject en sí mismo, que tiene el resultado de disminuir el recuento de referencias en el lado COM de la valla para que este objeto COM se pueda liberar. Pero dado que el orden en que se llaman los finalizadores es incierto, es muy posible que los finalizadores para los objetos COM a los que hace referencia su objeto se disparen antes del finalizador para su objeto. Por lo tanto, el código dentro del finalizador podría funcionar algunas veces, pero, la mayoría de las veces, uno o más de los Contenedores invocables en tiempo de ejecución a los que su objeto hace referencia ya habrán llamado a sus finalizadores y el objeto COM subyacente se habrá liberado antes de que el finalizador llegue a ejecuta su código.