Pregunta

C++/CLI amablemente genera el IDisposable andamiaje para usted a la hora de implementar un destructor de una clase ref.También, si no implementar un destructor, pero su clase tiene una variable miembro que implementa IDisposable, a continuación, IDisposable es de nuevo automáticamente se implementan en su clase.Es bastante útil y mucho mejor que la forma IDisposable se maneja en C#.

Me he topado con este comportamiento a la hora de la implementación de una clase ref que se aferra a un msclr::com::ptr (un puntero inteligente que contiene un RCW).

ref class Test /* : IDisposable added by the compiler */
{
  msclr::com::ptr<IWhatever> _aComObject;
}

En mi caso concreto, el objeto COM que hace referencia mi clase no 'lock' algún recurso no administrado, efectivamente solo usa un poco de memoria no administrada que el CLR no puede ver.Por lo tanto me gustaría evitar confundir a los usuarios de mi clase ref por la no aplicación de IDisposable la clase.En lugar de ello quiero hacer el CLR consciente de la existencia del objeto COM mediante el uso de la GC API para agregar la correspondiente presión de memoria.

Entonces, la pregunta es:es allí una manera de suprimir la aplicación de IDisposable en un ref de la clase que no implementa un destructor, pero mantiene una IDisposable miembro de la variable?

NB: a menudo, esta sería la cosa incorrecta a hacer, ya que impide que los usuarios de la clase de forma determinista la eliminación de la subyacente objeto COM, pero dadas las circunstancias particulares, la exposición de IDisposable tiene el potencial de confundir a los usuarios de mi clase ref, ya que realmente no es necesario Disponer de la referencia de la clase en cuestión.

Supongo que una opción sería implementar una variante de msclr::com::ptr sin un destructor.

Cualquier otro método para suprimir la adición automática de IDisposable se agradece.Gracias.


Respuesta

Declarar _aComObject como un identificador de msclr::com::ptr (msclr::com::ptr<IWhatever>^).El compilador no, a continuación, respecto Test como ser el "dueño" de la com ptr objeto, y no Disponer de él cuando la Prueba se elimina.

¿Fue útil?

Solución

Creo que la respuesta es llevar a cabo un manejar a la msclr :: :: com PTR en vez de sostener que 'por valor' (que aún se mantiene como un mango 'entre bastidores' , excepto el compilador de C ++ CLI lo trata como un valor -. 'borrar' it (llamando Desechar) cuando se elimina el objeto propietario (Dispuesta))

Otros consejos

No estoy seguro estoy de acuerdo con la ratioanle que evite la aplicación IDispose - pero ¿por qué no sólo almacenar una iWhatever * en su clase. El compilador no debe entonces generar la aplicación IDisposable.

Si no desea que el comportamiento destructor entonces, ¿qué beneficio es la envoltura com :: ptr la compra de ti? Se puede declarar siempre una com :: PTR en la pila y asignar el puntero del miembro para que en cualquier método determinado si realmente lo necesita.

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