Applicazione di Office non viene chiuso dopo l'automazione da client di Visual Studio.

Traduzione articoli Traduzione articoli
Identificativo articolo: 317109 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sintomi

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

Cause

Quando chiamate Visual Studio .net COM un oggetto gestito. codice, viene creato automaticamente un Runtime Callable Wrapper (RCW). il RCW effettua il marshalling delle chiamate tra l'applicazione e l'oggetto COM. Il wrapper RCW conserva un conteggio dei riferimenti dell'oggetto COM. Pertanto, se non sono stati tutti i riferimenti rilasciato il RCW, l'oggetto COM non viene chiuso.

Risoluzione

Per assicurarsi che l'applicazione di Office viene chiuso, assicurarsi che che il codice di automazione soddisfi i seguenti criteri:
  • Dichiarare una nuova variabile di ciascun oggetto. Ad esempio, modificare la seguente riga di codice
    oBook = oExcel.Workbooks.Add()
    					
    al seguente:
    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    					
  • Utilizzo System.Runtime.InteropServices.Marshal.ReleaseComObject in un ciclo finché restituisce 0 al termine dell'utilizzo di un oggetto. Il System.Runtime.InteropServices.Marshal.ReleaseComObject Decrementa il conteggio dei riferimenti del wrapper RCW e il ciclo garantisce che il componente COM sottostante viene rilasciato indipendentemente da come numero di volte ha reimmesse CLR.
  • Per rilasciare il riferimento alla variabile, impostare la variabile uguale a Nothing o Null.
  • Utilizzare il Chiudere metodo dell'oggetto per indicare al server di applicazioni Office arresto del sistema.

Status

Questo un comportamento legato alla progettazione.

Informazioni

Procedura per riprodurre il comportamento

  1. Avviare Visual Studio .net.
  2. Scegliere Nuovo dal menu File , quindi progetto. In Visual Basic progetti, selezionare Applicazione Windows e fare clic su OK. Per impostazione predefinita verrà creato Form1.
  3. Aggiungere un riferimento alla Libreria oggetti di Microsoft Excel. Per effettuare questa operazione, attenersi alla seguente procedura:
    1. Scegliere Aggiungi riferimentodal menu progetto .
    2. Nella scheda COM individuare la libreria di oggetti di Excel e quindi fare clic su Seleziona.

      Per Microsoft Excel 2002: libreria di oggetti di Microsoft Excel 10.0

      Nota Se non è già fatto, è consigliabile che si scaricare e installare il Microsoft Office XP assembly di interoperabilità primari (PIA). Per ulteriori informazioni sugli assembly di interoperabilità primari di Office XP, fare clic sul numero dell'articolo riportato di seguito per visualizzare l'articolo della Microsoft Knowledge Base:
      328912Assembly di interoperabilità primari (PIA) di Microsoft Office XP sono disponibili per il download
      Per Microsoft Office di Excel 2003: libreria di oggetti di Microsoft Excel 11.0
    3. Fare clic su OK nella finestra di dialogo Aggiungi riferimento per accettare le selezioni.
  4. Dal menu Visualizza , fare clic su Strumentie quindi trascinare un controllo Button in Form1.
  5. Fare doppio clic su Button1. Verrà visualizzata la finestra del codice per il form.
  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
    					
    con il 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 Task Manager Windows. In Visual Studio, visualizzare la Finestra di output per visualizzare i messaggi di debug. Fare clic sul pulsante di comando e notare che un'istanza di Excel. exe viene visualizzato nell'elenco dei processi .
  10. L'istanza di Excel ancora eseguito nell'elenco attività anche Dopo l'applicazione ha terminato la sospensione. Chiudere la finestra di dialogo e notare che Excel non viene più visualizzato nell'elenco processi .
  11. Quando si implementa la procedura descritta nella sezione "Risoluzione", l'applicazione di Office viene chiuso dopo il rilascio l'ultima variabile. Sostituire il funzione nel passaggio 5 con il seguente codice:
      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 sta utilizzando Visual C#., 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 utilizzare System.Runtime.InteropServices.Marshal.FinalReleaseComObject anziché while loop chiamata System.Runtime.InteropServices.Marshal.ReleaseComObject per ottenere lo stesso risultato.

Risoluzione dei problemi

Si noti che se la procedura descritta nel Sezione "Procedura per riprodurre il comportamento" e il server l'opzione ancora non Chiudi verso il basso, è possibile utilizzare il GC .Collect metodo e il GC .WaitForPendingFinalizers() metodo dopo aver rilasciato l'ultimo oggetto. Poiché il runtime esegue una garbage collection sul RCW, il GC .Collect metodo impone il garbage collector per l'esecuzione e potrebbe rilasciare qualsiasi riferimenti che è ancora il wrapper RCW. Il GC .Collect metodo tenta di recuperare la memoria massima disponibile. Si noti che Questo non garantisce che tutta la memoria verrà recuperata.

Proprietà

Identificativo articolo: 317109 - Ultima modifica: venerdì 3 agosto 2012 - Revisione: 1.0
Le informazioni in questo articolo si applicano a:
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Chiavi: 
kbautomation kbprb kbmt KB317109 KbMtit
Traduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 317109
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com