Chiusura pulita degli oggetti per Excel

di il
3 risposte

Chiusura pulita degli oggetti per Excel

Buondi
Dopo aver creato un file excel da codice, alla chiusura dell'applicazione chiudo e anniento tutti i riferimenti di oggetti Range e Worksheet.
Per chiudere l'oggetto Workbook e l'oggetto Excel uso, allla chiusura del form, questo codice che in parte ho trovato in rete:

        
        ' oWbk =oggetto di tipo WorkBook
        ' oExec = oggetto di Tipo Excel.Application
       
       Try
            If (oWbk IsNot Nothing) Then
                oWbk.Close()
            End If
        Catch
        End Try

        If (oExc IsNot Nothing) Then
            oExc.Quit()
        End If
        
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oWbk)
        Catch
        Finally
        	obj = Nothing
            	GC.Collect()
        End Try
        
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oExec)
        Catch
        Finally
        	obj = Nothing
            	GC.Collect()
        End Try
        
                
Volevo sapere se (e a cosa) serve quel "System.Runtime.Interop.Marshal.ReleaseComObject".. visto che viene regolarmente saltato, e se avete suggerimenti o correzioni in merito.
Uso Visual Studio Community 2019
Grazie

3 Risposte

  • Re: Chiusura pulita degli oggetti per Excel

    Sabo ha scritto:


    Volevo sapere se (e a cosa) serve quel "System.Runtime.Interop.Marshal.ReleaseComObject".. visto che viene regolarmente saltato, e se avete suggerimenti o correzioni in merito.
    Cosa intendi con "viene regolarmente saltato"? Che non viene eseguita quell'istruzione?

    Dal punto di vista teorico, se non ricordo male, usando gli Office PIA (Platform Interop Assemblies), dovrebbe essere sufficiente chiamare il metodo Close() sull'applicazione al termine dell'uso, magari aiutandosi con un costrutto try...finally, sempre se non si vuole lasciare al GC il compito di farlo nella fase di finalizzazione dell'oggetto (meglio anticipare).

    Ciao!
  • Re: Chiusura pulita degli oggetti per Excel

    Si intendo che viene saltata perchè va in errore praticamente sempre e quindi il Try Catch la salta..
    Lasciarla o meno non mi crea problemi, proprio perche appunto non mi blocca l'esecuzione, ma volevo capire perchè è stat ainsertita da chi ha scritto il codice (che come detto ho trovato in rete..).
    Io ad esempio (reduce da VB6) non avrei nemmeno messo le istruzioni .Close e .Quit ma avrei impostato direttamente a Nothing gli oggetti. Ma forse così è piu pulito, credo...
  • Re: Chiusura pulita degli oggetti per Excel

    Sabo ha scritto:


    Si intendo che viene saltata perchè va in errore praticamente sempre e quindi il Try Catch la salta..
    Lasciarla o meno non mi crea problemi, proprio perche appunto non mi blocca l'esecuzione, ma volevo capire perchè è stat ainsertita da chi ha scritto il codice (che come detto ho trovato in rete..).
    Magari è stata messa da qualcuno che credeva di garantirsi maggiori possibilità di deallocare qualcosa che, in realtà, viene tranquillamente rilasciata senza bisogno di ulteriori provvedimenti.

    Sabo ha scritto:


    Io ad esempio (reduce da VB6) non avrei nemmeno messo le istruzioni .Close e .Quit ma avrei impostato direttamente a Nothing gli oggetti. Ma forse così è piu pulito, credo...
    Queste chiamate dovrebbero invece essere inserite, per rilasciare il prima possibile l'oggetto COM dell'applicazione senza attendere l'intervento del GC.

    Immagina uno scenario in cui la tua routine viene chiamata di frequente: potresti avere in un determinato momento più oggetti "aperti" di quelli che realmente ti servono, pregiudicando quindi la corretta esecuzione del programma.

    Impostare invece le variabili a Nothing serve poco, almeno se si tratta di variabili locali che quindi uscirebbero in ogni caso dallo scope.

    Ciao!
Devi accedere o registrarti per scrivere nel forum
3 risposte