Office-Anwendung wird nicht nach der Automatisierung von Visual Studio .net Client beendet.

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 317109 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Problembeschreibung

Wenn Sie eine Microsoft Office-Anwendung aus automatisieren Microsoft Visual Basic .net oder Microsoft Visual C# .net, wird die Office-Anwendung nicht wann beendet Rufen Sie die Quit -Methode.

Ursache

Wenn Visual Studio .net Aufrufen einer COM-aus-Objekt verwaltet Code, wird dadurch ein Runtime Callable Wrapper (RCW) automatisch erstellt. Der RCW marshallt Aufrufe zwischen .net Anwendung und das COM-Objekt. Der RCW hält ein die Anzahl der Verweise auf COM-Objekt. Daher, wenn alle Verweise nicht wurden auf den RCW freigegeben, wird das COM-Objekt nicht beendet werden.

Lösung

Um sicherzustellen, dass die Office-Anwendung beendet wird, stellen Sie sicher dass es sich bei Ihrem Automatisierungscode die folgenden Kriterien erfüllt:
  • Jedes Objekt als eine neue Variable zu deklarieren. Beispielsweise ändern die folgende Codezeile
    oBook = oExcel.Workbooks.Add()
    					
    die folgende:
    dim oBooks as Excel.Workbooks
    oBooks = oExcel.Workbooks
    oBook = oBooks.Add()
    					
  • Verwendung System.Runtime.InteropServices.Marshal.ReleaseComObject in einer Schleife bis es 0 zurückgibt, wenn Sie ein Objekt mit abgeschlossen haben. Die System.Runtime.InteropServices.Marshal.ReleaseComObject Dekrementiert der Verweiszähler des RCW, und die Schleife sichergestellt wird, dass die zugrunde liegende COM-Komponente, unabhängig davon, wie freigegeben wird viele Male hat es die CLR erneut.
  • Um den Verweis auf die Variable zu lösen, setzen Sie die variable gleich Nichts oder NULL.
  • Verwendung der Beenden Methode des Objekts Application Office anzuweisen, den Server an wurde beendet.

Status

Dies Verhalten ist beabsichtigt.

Weitere Informationen

Schritte zum Reproduzieren des Verhaltens

  1. Starten Sie Visual Studio .net.
  2. Klicken Sie im Menü Datei klicken Sie auf neu , und klicken Sie dann auf Projekt. Wählen Sie unter Visual Basic-Projektedie Windows-Anwendung , und klicken Sie auf OK. Form1 wird standardmäßig erstellt.
  3. Fügen Sie einen Verweis auf die Microsoft Excel Object Library. Gehen Sie hierzu folgendermaßen vor:
    1. Klicken Sie im Menü Projekt auf Verweis hinzufügen.
    2. Suchen Sie auf der Registerkarte COM die Objektbibliothek für Excel, und klicken Sie dann auf auswählen.

      Für Microsoft Excel 2002: Microsoft Excel 10.0-Objektbibliothek

      Hinweis Wenn Sie dies noch nicht getan haben, wird empfohlen, dass Sie Downloaden Sie und installieren Sie die Microsoft Office XP Primary Interop Assemblies (PIAs). Weitere Informationen zu Office XP-PIAs finden Sie die folgende Artikelnummer klicken, um den Artikel in der Microsoft Knowledge Base anzuzeigen:
      328912Microsoft Office XP primary interop Assemblies (PIAs) stehen zum download
      Für Microsoft Office in Excel 2003: Microsoft Excel 11.0-Objektbibliothek
    3. Klicken Sie auf OK im Dialogfeld Verweise hinzufügen , um Ihre Auswahl zu bestätigen.
  4. Klicken Sie im Menü Ansicht auf Toolboxund ziehen Sie ein Button -Steuerelement auf Form1.
  5. Doppelklicken Sie auf Button1. Das Codefenster für das Formular wird angezeigt.
  6. Fügen Sie folgenden Code am Anfang von Form1.vb:
    Imports Microsoft.Office.Interop
    					
  7. Ersetzen Sie den folgenden Code im Code-Fenster
        Private Sub Button1_Click(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Button1.Click
        End Sub
    					
    mit den folgenden:
    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. Drücken Sie F5, um die Anwendung auszuführen.
  9. Öffnen Sie Windows Task-Manager. Anzeigen in Visual Studio, die Die Debug-Meldungen finden Sie unter Ausgabefenster. Klicken Sie auf die Befehlsschaltfläche, und beachten Sie, dass eine Instanz der Datei "Excel.exe" wird in der Liste der Prozesse angezeigt.
  10. Die Instanz von Excel wird immer noch selbst in der Aufgabenliste ausgeführt. Nachdem die Anwendung im Ruhezustand beendet hat. Schließen Sie das Dialogfeld zu, und beachten Sie, dass Excel wird nicht mehr in der Liste der Prozesse angezeigt.
  11. Wenn Sie die Schritte im Abschnitt "Lösung" implementieren, die Office-Anwendung wird beendet, nachdem es die letzte Variable frei. Ersetzen Sie die Funktion in Schritt 5 durch folgenden Code:
      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
    					
Bei Verwendung von Visual C# .net, verweisen Sie den Code für die NAR() -Funktion:
private void NAR(object o)
{
    try 
    {
        while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
    }
    catch {}
    finally 
    {
        o = null;
    }
}
Hinweis: Beginnend mit.NET Framework 2.0, können Sie System.Runtime.InteropServices.Marshal.FinalReleaseComObject anstelle der While Schleife aufrufende System.Runtime.InteropServices.Marshal.ReleaseComObject , um das gleiche Ergebnis zu erzielen.

Problembehandlung

Beachten Sie, dass Sie die Schritte, die in beschriebenen der Abschnitt "Schritte zum Reproduzieren des Verhaltens" und der Server noch herunter nicht nach unten können Sie die -GC.Collect() -Methode und die -GC.WaitForPendingFinalizers() -Methode, nachdem Sie das letzte Objekt freigeben. Da die Common Language Runtime führt eine Garbagecollection auf den RCW, der -GC.Collect() -Methode erzwingt, dass der Garbage Collector ausgeführt und möglicherweise alle freigeben Verweise, die der RCW noch. Der -GC.Collect() -Methode versucht, den maximalen Arbeitsspeicher freizugeben, die verfügbar ist. Beachten Sie, dass Dies garantiert nicht, dass der gesamte Speicher freigegeben wird.

Eigenschaften

Artikel-ID: 317109 - Geändert am: Freitag, 3. August 2012 - Version: 1.0
Die Informationen in diesem Artikel beziehen sich auf:
  • 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
Keywords: 
kbautomation kbprb kbmt KB317109 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 317109
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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