2009-09-03 14 views
5

Questa è una domanda successiva a How to properly clean up excel interop objects in c#.Come pulire correttamente gli oggetti di interoperabilità in C#

Il problema è che l'utilizzo di chiamate concatenate (ad esempio ExcelObject.Foo.Bar()) all'interno dello spazio dei nomi di Excel impedisce la garbage collection per gli oggetti COM. Invece, è necessario creare esplicitamente un riferimento a ciascun oggetto COM utilizzato e rilasciarli esplicitamente utilizzando Marhsal.ReleaseComObject().

È il comportamento di non rilasciare oggetti COM dopo una chiamata concatenata specifica solo agli oggetti COM di Excel? È eccessivo applicare questo tipo di modello ogni volta che viene utilizzato un oggetto COM?

risposta

6

È decisamente più importante gestire correttamente i rilasci quando si gestiscono le applicazioni di Office rispetto a molte altre librerie COM, per due motivi.

  1. Le app di Office vengono eseguite come server fuori processo e non in-process library. Se non si riesce a ripulire correttamente, si lascia un processo in esecuzione.
  2. Le app di Office (in particolare Excel IIRC) non vengono terminate correttamente anche se si chiama Application.Quit, se esistono riferimenti eccezionali ai propri oggetti COM.

Per le normali librerie COM in-proc, le conseguenze di una mancata pulizia non sono così drammatiche. Quando il tuo processo si chiude, tutte le librerie in-proc se ne vanno. E se ti dimentichi di chiamare ReleaseComObject su un oggetto quando non ne hai più bisogno, alla fine sarà comunque curato quando l'oggetto verrà finalizzato.

Detto questo, questa non è una scusa per scrivere codice sciatto.

+0

Punti molto buoni RE: perché è necessario pulire gli oggetti di interoperabilità degli uffici –

2

Gli oggetti COM sono essenzialmente codice non gestito e non appena si inizia a chiamare il codice non gestito da un'applicazione gestita, diventa responsabilità dell'utente pulire dopo tale codice non gestito.

In breve, lo schema collegato nel post precedente è necessario per tutti gli oggetti COM.

+0

... per alcune definizioni di "necessario". All'arresto del processo (o scaricamento del dominio dell'app, se ciò accade prima), credo che tutti gli RCW (runtime callable wrappers) che non sono stati ancora distrutti verranno rilasciati. Sfortunatamente, intorno a loro non ci sono forti garanzie che vengano distrutte correttamente e che vengano eseguiti tutti i finalizzatori. Tra l'altro, se la distruzione di un oggetto COM richiede più di 2 secondi, CLR interromperà l'intera coda dei finalizzatori in esecuzione su quel thread. – reuben

+2

@Reuben, si prega di leggere la domanda, la risposta è corretta al 100% per quanto riguarda la domanda che viene posta, tuttavia grandi dettagli intrinseci su COM non hanno nulla a che fare con questa domanda. –

Problemi correlati