2016-08-21 6 views
-1

Ich entwickle eine VB-Formulare-Anwendung, die auf Excel-Blatt-Inhalt mit der Office-Interop-Bibliothek zugreifen. Die Entwicklung auf Windows 8 mit Office 2016.Richtig schließen eine Office-Interop-Excel-Anwendung

Nehmen Sie das folgende triviale Beispiel:

Import excel = Microsoft.Office.Interop.Excel 

Private Sub Form_Load(sender As Object, e as EventArgs) Handles MyBase.Load 
    Dim excelApp as excel.Application = New excel.Application 
    excelApp.Quit 
End Sub 

Dies scheint ein Leck zu verursachen. Während das Formular noch geöffnet ist, zeigt ein Tasklistenaufruf an der Eingabeaufforderung eine ausgeführte Excel-Anwendung an (verbraucht 15m Arbeitsspeicher auf meinem Computer). Der Excel-Prozess endet erst, wenn die Basis-VB-Anwendung vom Benutzer geschlossen wurde.

Für meine Anwendung, je nach dem übergeordneten Prozess zu schließen, bevor die Excel-Prozesse geschlossen sind, ist inakzeptabel. Wie kann ich diese Excel-Prozesse beenden?

+0

Bitte suchen Sie diese Dinge, die ** Antworten ** haben, bevor Sie Dups schreiben ... – Codexer

+0

Entschuldigung, habe das bei meiner Suche nicht gefunden. – khol

Antwort

1

Sie die Marshal Klasse für diese verwenden können (MSDN). Ich fand, dass das Ausführen aller Excel-Objekte in umgekehrter Reihenfolge das beste -> Arbeitsblatt, Arbeitsmappe, Anwendung war.

+0

Könnten Sie bitte erklären, warum das Marshalling benötigt wird und warum die umgekehrte Reihenfolge? Dies wird dem OP helfen, sein Problem zu verstehen ... – Codexer

+0

Als ich Excel als COM-Objekt benutzte, fand ich, dass es schwierig war, den Prozess freizugeben. Nach vielem Experimentieren und einiger Anleitung von einigen anderen in Foren wurde dies gefunden und mir gesagt, dass es eine Best Practice für diese Objekte ist. Die umgekehrte Reihenfolge war hilfreich - ich erinnere mich nicht an den genauen Grund - viel Zeit und Bier sind passiert. MS hat diese Funktion nur dafür entwickelt. – OneFineDay

+2

Schauen Sie sich diesen Artikel von Sidharth [** hier **] an (http://www.siddharthrout.com/2012/08/06/vb-net-two-dot-rule-when-working-with-office-applications) -2 /) was das erklärt. Sehr gut beim Arbeiten mit COM-Objekten ... Der erste Absatz erklärt warum ... – Codexer

-1

Ein Hack, den ich gefunden habe, ist die Referenz und Müll auf null sammeln:

Import excel = Microsoft.Office.Interop.Excel 

Private Sub Form_Load(sender As Object, e as EventArgs) Handles MyBase.Load 
    Dim excelApp as excel.Application = New excel.Application 
    excelApp.Quit() 
    excelApp = Nothing 
    GC.Collect() 
End Sub 
Verwandte Themen