Accedi con Microsoft
Accedi o crea un account.
Salve,
Seleziona un altro account.
Hai più account
Scegli l'account con cui vuoi accedere.

Vedere gli altri prodotti a cui si applica questo articolo.

Sintomi

Quando si automatizza un'applicazione Microsoft Office da Microsoft Visual Basic .NET o Microsoft Visual C# .NET, l'applicazione Office non viene chiusa quando si chiama il metodo Quit.

Causa

Quando Visual Studio .NET chiama un oggetto COM da codice gestito, crea automaticamente un Runtime Callable Wrapper (RCW). L'RCW effettua il marshalling delle chiamate tra l'applicazione .NET e l'oggetto COM. L'RCW mantiene un conteggio dei riferimenti sull'oggetto COM. Pertanto, se tutti i riferimenti non sono stati rilasciati nell'RCW, l'oggetto COM non viene chiuso.

Risoluzione

Per assicurarsi che l'applicazione Office, determinare se il codice di automazione soddisfa i criteri seguenti:To make sure that the Office application exits, determine whether your automation code meets the following criteria:

  • Dichiarare ogni oggetto come nuova variabile. Ad esempio, modificare la riga di codice seguente:

    oBook = oExcel.Workbooks.Add()
    

    Modificare questa impostazione nel modo seguente:

    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    
  • Usare System.Runtime.InteropServices.Marshal.ReleaseComObject in un ciclo finché non restituisce 0 al termine dell'uso di un oggetto. System.Runtime.InteropServices.Marshal.ReleaseComObject decrementa il conteggio dei riferimenti dell'RCW e il ciclo assicura che il componente COM sottostante sia stato rilasciato indipendentemente dal numero di volte in cui è nuovamente entrato in CLR.

  • Per rilasciare il riferimento alla variabile, impostare la variabile su Nothing o Null.

  • Usare il metodo Quit dell'Office dell'applicazione per indicare al server di arrestarsi.

Stato

Si tratta di un comportamento correlato alla progettazione del prodotto.

Ulteriori informazioni

Procedura per riprodurre il problema

  1. Avviare Visual Studio .NET.

  2. Scegliere Nuovo dal menu File e quindi fare clic su Project. In Visual Basic progetti selezionare Windows appalto e quindi fare clic su OK.

    Nota Form1 viene creato per impostazione predefinita.

  3. Aggiungere un riferimento alla raccolta Microsoft Excel oggetti. A tal fine, attenersi alla seguente procedura:

    1. Scegliere Aggiungi riferimento dal menu Progetto.

    2. Nella scheda COM individuare la raccolta oggetti per Excel e quindi fare clic su Seleziona.

      Per Microsoft Excel 2002: Microsoft Excel 10.0 Object LibraryNote

      Se questa operazione non è già stata eseguita, è consigliabile scaricare e installare gli assembly di interoperabilità primari (PIA) di Microsoft Office XP.

      Per altre informazioni sui Office più personali di XP, vedere il seguente articolo della Microsoft Knowledge Base:

      328912 Microsoft Office gli assembly di interoperabilità primari (PIA) di XP sono disponibili per il download
        Per Microsoft Office Excel 2003: Microsoft Excel 11.0 Object Library

    3. Fare clic su OK nella finestra di dialogo Aggiungi riferimenti per accettare le selezioni.

  4. Nel menu Visualizza fare clic su Casella degli strumenti e quindi trascinare un controllo Pulsante in Form1.

  5. Fare doppio clic su Button1.

    Nota Viene visualizzata la finestra del codice per la maschera.

  6. Aggiungere il codice seguente all'inizio di Form1.vb:

    Imports Microsoft.Office.Interop
    
  7. Sostituire il codice seguente nella finestra del codice:

        Private Sub Button1_Click(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Button1.Click
        End Sub
    

    Sostituire il codice seguente:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim oApp As New Excel.Application()
        Dim oBook As Excel.Workbook = oApp.Workbooks.Add
        Dim oSheet As Excel.Worksheet = oApp.ActiveSheet
    
        oSheet = Nothing
        oBook.Close(False)
        oBook = Nothing
        oApp.Quit()
        oApp = Nothing
    
        Debug.WriteLine("Sleeping...")
        System.Threading.Thread.Sleep(5000)
        Debug.WriteLine("End Excel")
    End Sub
    
  8. Premere F5 per eseguire l'applicazione.

  9. Aprire Windows Gestione attività. In Visual Studio visualizzare la finestra Output per visualizzare i messaggi di debug. Fare clic sul pulsante di comando. Si noti che un'istanza Excel.exe viene visualizzata nell'elenco Processi.

  10. L'istanza di Excel viene ancora eseguita nell'elenco attività anche dopo che l'applicazione ha finito di dormire. Chiudere la finestra di dialogo e notare Excel non viene più visualizzato nell'elenco Processi.

  11. Quando si esegue la procedura nella sezione "Risoluzione", l'applicazione Office viene chiusa dopo il rilascio dell'ultima variabile. Sostituire la funzione nel passaggio 5 usando il codice seguente:

      Private Sub NAR(ByVal o As Object)
        Try
          While (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0)
          End While
        Catch
        Finally
          o = Nothing
        End Try
      End Sub
    
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim oApp As New Excel.Application()
        Dim oBooks As Excel.Workbooks = oApp.Workbooks
        Dim oBook As Excel.Workbook = oBooks.Add
        Dim oSheet As Excel.Worksheet = oApp.ActiveSheet
    
        NAR(oSheet)
        oBook.Close(False)
        NAR(oBook)
        NAR(oBooks)
        oApp.Quit()
        NAR(oApp)
    
        Debug.WriteLine("Sleeping...")
        System.Threading.Thread.Sleep(5000)
        Debug.WriteLine("End Excel")
    End Sub
    

Se si usa Visual C# .NET, fare riferimento al codice per la funzione NAR():

private void NAR(object o)
{
    try 
    {
        while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
    }
    catch {}
    finally 
    {
        o = null;
    }
}

Nota A partire da .NET Framework 2.0, è possibile usare System.Runtime.InteropServices.Marshal.FinalReleaseComObject invece del ciclo while che chiama System.Runtime.InteropServices.Marshal.ReleaseComObject per ottenere lo stesso risultato.
 

Risoluzione dei problemi

Note Se si seguono i passaggi descritti nella sezione "Procedura per riprodurre il comportamento" e il server non si arresta ancora, è possibile usare il catalogo globale. Metodo Collect() e GC. Metodo WaitForPendingFinalizers() dopo il rilascio dell'ultimo oggetto. Poiché il runtime esegue la procedura di Garbage Collection nell'RCW, il gc. Il metodo Collect() forza l'esecuzione del Garbage Collector e potrebbe rilasciare tutti i riferimenti ancora presenti nell'RCW. Il gc. Il metodo Collect() tenta di recuperare la memoria massima disponibile. Questo non garantisce che tutta la memoria venga recuperata.

Le informazioni in questo articolo si applicano a

Questo articolo si applica anche a:

  • Microsoft Visual Basic .NET (tutte le edizioni)

  • Microsoft Visual C# .NET (tutte le edizioni)

  • Microsoft Office 2016 (tutte le edizioni)

  • Microsoft Office 2013 (tutte le edizioni)

Serve aiuto?

Vuoi altre opzioni?

Esplorare i vantaggi dell'abbonamento e i corsi di formazione, scoprire come proteggere il dispositivo e molto altro ancora.

Le community aiutano a porre e a rispondere alle domande, a fornire feedback e ad ascoltare gli esperti con approfondite conoscenze.

Queste informazioni sono risultate utili?

Come valuti la qualità della lingua?
Cosa ha influito sulla tua esperienza?
Premendo Inviare, il tuo feedback verrà usato per migliorare i prodotti e i servizi Microsoft. L'amministratore IT potrà raccogliere questi dati. Informativa sulla privacy.

Grazie per il feedback!

×