2010-10-14 14 views

risposta

22

C'è un po 'di virtù in FinalReleaseComObject, il programma si bloccherà più rapidamente. "L'oggetto COM che è stato separato dal suo RCW sottostante non può essere utilizzato" è il CLR che ti dice che ti stai prendendo cura dei riferimenti COM invece di lasciarlo su CLR è stato un errore. Il tuo chilometraggio può variare, non ti puoi davvero fidare di farlo bene quando funziona sulla tua macchina di sviluppo. Assicurati di implementare una buona segnalazione degli errori quando si distribuisce il codice sulla macchina del cliente.

La virtù è che c'è solo un posto nel codice in cui si è sbagliato, la chiamata FinalReleaseComObject. Diventa molto più confuso quando si utilizza ReleaseComObject. Perché questo non verrà rilevato per un po ', bloccando il tuo programma quando il CLR chiama l'ultimo IUnknown::Release(), quello che distrugge l'oggetto. Molto lontano da una chiamata errata ReleaseComObject. Ma questo è lo scenario del giorno del giudizio, il risultato più probabile è che la chiamata non fa alcuna differenza perché hai perso quelli difficili. Come mumble["foo"], un riferimento all'indicizzatore che è così difficile da vedere essere utilizzato.

Bene, il mio consiglio è ovvio: non farlo. Stai gareggiando con una macchina che non ha mai sbagliato. È solo un po 'lento a farlo. Un ottimo "reportage dalla vita reale" è available here. La sezione "Assassino silenzioso" è la più rilevante.

Se è assolutamente necessario che un server COM esca istantaneamente, lasciare che la macchina si occupi di ottenere tutti i conteggi di riferimento su 0. Lo si fa con GC.Collect(). Ma tieni presente che devi effettuare correttamente la chiamata se vuoi che funzioni anche quando esegui il debug. Non funzionerà nello stesso metodo che utilizza gli oggetti COM, spiegato in this answer. Mettilo invece nel metodo di chiamata.

+2

Stai suggerendo di non rilasciare affatto l'oggetto? –

+2

Sì. Perché pensi che devi? –

+1

Il nostro fornitore ha specificato nella propria documentazione che è necessario rilasciare tutti gli oggetti dopo averli utilizzati. –

Problemi correlati