2012-04-16 11 views
5

Ho una classe com C# che viene utilizzata dal codice umamaged. Posso eseguire il debug, ma non posso sapere quando viene rilasciato un oggetto. Se fosse stato implementato in C++, sarebbe stato chiamato descructur, su C# sarebbe stato rilasciato a GC. C'è un modo per tracciare quel momento? Grazie in anticipo.Rilascio traccia di oggetto com C#.

+0

Stai cercando un finalizzatore? – SLaks

+0

Solo curioso, puoi usare un C# [distruttore] (http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx) in questa situazione? –

+0

Nessuna risposta felice qui. L'istanza della classe [ComVisible] è un semplice oggetto .NET precedente. È tenuto in vita da un riferimento nel CCW. La chiamata finale Release() distrugge il CCW ma non accade nulla al tuo oggetto .NET. Fino a quando non viene raccolta la spazzatura come al solito. Dovrai eseguire il debug del codice nativo. Dove il problema senza dubbio si trova comunque. –

risposta

1

I tipi gestiti che gestiscono le risorse non gestite devono implementare l'interfaccia IDisposable. Questo dice ai consumatori del tuo codice che hanno bisogno di chiamare Dispose() sulle istanze dei tuoi oggetti quando hanno finito con loro (ad esempio, avvolgerli in un blocco using quando possibile).

Un'implementazione corretta di IDisposable rilascerà le risorse native nel finalizzatore, ma i client possono chiamare Dispose() prima del rilascio deterministico delle risorse non gestite. In entrambi i casi si evita una perdita, ma è meglio chiamare Dispose() il più rapidamente possibile.

Here is an SO question quali dettagli del processo.

+0

Il problema è che non riesco a controllare il codice non gestito. Non esiste alcuna pulizia necessaria che non può essere eseguita da GC. Vorrei solo sapere cosa è la vita prevista del mio oggetto. – user629926

+0

Se non si ha il controllo sul codice nativo, non capisco la domanda. Il codice gestito non ha modo di ripulire il codice nativo a meno che il codice nativo non definisca un'interfaccia per farlo. Il GC che si occupa del wrapper gestito è irrilevante; non pulisce solo magicamente le cose native. Devi farlo tu stesso implementando IDisposable e chiamando alcune funzioni sulle tue risorse native per liberarlo. –

+0

Non ho risorse native per la pulizia, voglio solo sapere quando viene realizzato warper gestito. – user629926