Cuando llega el tiempo de ejecución .NET mantenga una referencia contador> 1 para objetos COM?

StackOverflow https://stackoverflow.com/questions/2567236

  •  24-09-2019
  •  | 
  •  

Pregunta

Hasta hace poco, yo creía que el tiempo de ejecución de .NET sólo aumenta el contador de referencias de objetos COM por 1 hora de crear un tiempo de ejecución se puede llamar envoltura , y que la envoltura sólo uno de tales runtime-exigible para cualquier objeto COM dado.

Si no me equivoco, lo anterior implica que y href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.releasecomobject.aspx" rel="noreferrer"> Marshal.ReleaseComObject hacer lo mismo en la práctica.

Sin embargo, hoy en día yo estaba escribiendo algunas pruebas para verificar que los objetos COM están correctamente puestos en libertad por mi código. Lo hago invocando el objeto supuestamente liberado y la comprobación de la InvalidComObjectException esperado. Resulta que hay casos en que la excepción se produce después de un FinalReleaseComObject, pero no después de un ReleaseComObject.

¿Quiere esto decir que el tiempo de ejecución .NET 2.0 puede contener más de una referencia a un objeto COM? Si es así, ¿cuándo lo hace?

¿Fue útil?

Solución

Hay un nivel extra de indirección aquí. Sí, el RCW mantiene un recuento de referencia en los punteros de interfaz COM nativos. Pero la RCW tiene una cuenta de referencia también se incrementa cada vez que un puntero de interfaz COM está asignado a la RCW. Lo cual puede suceder si un método COM devuelve un puntero de interfaz. El finalizador de la correspondiente .NET contenedor de clase decrementa a él.

Se puede jugar con esa referencia contar directamente a través Marshal.ReleaseComObject (), el cual, se reduce en uno como el finalizador hace, y Marshal.FinalReleaseComObject (), que electrocuta a cero, lo que garantiza que el IUnknown :: Release () método se llama. Ellos, por supuesto caída en la categoría de "mejor que sepas lo que estás haciendo". Hacerlo mal produce el feo y undebuggable "objeto COM separado de su RCW subyacente" excepción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top