2012-04-16 11 views
5

Tengo una clase c com que usa el código de umamaged. Puedo depurarlo, pero no puedo saber cuándo se lanza un objeto. Si se hubiera implementado en C++, se llamaría descructur, en C# se liberaría a GC. ¿Hay alguna manera de rastrear ese momento? Gracias de antemano.Liberación de pista del objeto com C#.

+0

¿Está buscando un finalizador? – SLaks

+0

Simplemente curioso, ¿puedes usar un C# [destructor] (http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx) en esta situación? –

+0

No hay una respuesta feliz aquí. Su instancia de clase [ComVisible] es un simple objeto .NET antiguo. Se mantiene vivo por una referencia en la CCW. La llamada a Release() final destruye la CCW, pero no ocurre nada con su objeto .NET. Hasta que se recoja basura como es normal. Deberá depurar el código nativo. Donde el problema sin duda se encuentra de todos modos. –

Respuesta

1

Los tipos gestionados que mantienen recursos no administrados deben implementar la interfaz IDisposable. Esto le informa a los consumidores de su código que necesitan llamar al Dispose() en instancias de su (s) objeto (s) cuando terminan con ellos (es decir, envuélvalos en un bloque using cuando sea posible).

Una implementación adecuada de IDisposable lanzará los recursos nativos en su finalizador, pero los clientes pueden llamar al Dispose() antes que para la liberación determinística de recursos no administrados. De cualquier forma, evita una fuga, pero es mejor llamar al Dispose() lo más rápido posible.

Here is an SO question que detalla el proceso.

+0

El problema es que no puedo controlar el código no administrado. No hay ninguna limpieza necesaria que GC no pueda realizar. Solo deseo saber qué duración se espera de mi objeto. – user629926

+0

Si no tienes control sobre el código nativo, entonces no entiendo la pregunta. El código administrado no tiene forma de limpiar el código nativo a menos que el código nativo defina una interfaz para hacerlo. El GC que se ocupa de su contenedor administrado es irrelevante; no solo limpia mágicamente las cosas nativas. Tienes que hacerlo tú mismo implementando IDisposable y llamando a alguna función en tus recursos nativos para liberarlo. –

+0

No tengo ningún recurso nativo para la limpieza, solo quiero saber cuándo se realiza Warper administrado. – user629926

Cuestiones relacionadas