Possiedo un oggetto gestito che chiama un server COM per allocare memoria. L'oggetto gestito deve chiamare nuovamente il server COM per liberare quella memoria prima che l'oggetto gestito si allontani per evitare una perdita di memoria. Questo oggetto implementa IDisposable
per garantire che venga effettuata la chiamata COM di rilascio memoria corretta.È sicuro chiamare un RCW da un finalizzatore?
Nel caso in cui il metodo Dispose
sia non chiamato, vorrei che il finalizzatore dell'oggetto liberasse la memoria. Il guaio è che le regole di finalizzazione sono che non devi accedere a nessun riferimento perché non sai quali altri oggetti sono già stati sottoposti a GC e/o finalizzati prima di te. Questo lascia l'unico stato dell'oggetto tangibile come campi (le maniglie sono le più comuni).
Ma chiamare un server COM implica passare attraverso un runtime callable wrapper (RCW) per liberare la memoria che ho un cookie da memorizzare in un campo. E 'sicuro che RCW chiama da un finalizzatore (è garantito che non sia stato eseguito da GC o finalizzato a questo punto)?
Per quelli di voi che non hanno familiarità con la messa a punto, anche se il filo finalizzatore viene eseguito in background di un AppDomain gestito mentre la sua esecuzione, a per i casi che toccano i riferimenti sarebbero teoricamente OK, finalizzazione avviene anche allo spegnimento dominio di applicazione, e in qualsiasi ordine - non solo nell'ordine delle relazioni di riferimento. Questo limita ciò che si può ritenere sia sicuro da toccare dal finalizzatore. Qualsiasi riferimento a un oggetto gestito potrebbe essere "cattivo" (memoria raccolta) anche se il riferimento non è nullo.
Aggiornamento: Ho appena provato e ottenuto questo:
un'eccezione non gestita di tipo 'System.Runtime.InteropServices.InvalidComObjectException' si è verificato in MyAssembly.dll
Ulteriori informazioni: oggetto COM che è stato separato dal suo RCW sottostante non può essere utilizzato.
Un metodo sul server COM (perché qualcuno dovrebbe chiamare Dispose su una RCW stessa? Sarei sorpreso se questo è anche possibile). –