2016-08-21 74 views
-1

我正在開發一個VB窗體應用程序,該應用程序使用辦公室互操作庫訪問Excel表格內容。與Office 2016正確關閉辦公室interop excel應用程序

在Windows 8開發看看下面的小例子:

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 

這似乎導致泄漏。在窗體仍處於打開狀態時,命令提示符下的任務列表調用將顯示正在運行的Excel應用程序(在我的計算機上消耗15m內存)。一旦基本的VB應用程序被用戶關閉,excel進程只會終止。

對於我的應用程序,取決於在關閉excel進程之前要關閉的父進程是不可接受的。我怎樣才能殺死這些excel進程?

+0

請在搜尋這些事情**有答案**發佈dups之前... – Codexer

+0

道歉,沒有發現,在我的搜索。 – khol

回答

1

可以使用Marshal類爲該(MSDN)。我發現以相反的順序運行所有的Excel對象是最好的 - >工作表,工作簿,應用程序。

Marshal.FinalReleaseComObject(comObj) 
+0

您能解釋爲什麼需要封送和爲什麼倒序嗎?這將有助於OP瞭解他的問題...... – Codexer

+0

當我使用excel作爲COM對象時,我發現在那裏發佈過程很困難。在經過多次實驗和論壇中的其他人的指導後 - 發現並告訴我這是這些對象的最佳實踐。相反的順序是有幫助的 - 我不記得確切的原因 - 很多時間和啤酒已經發生。 MS爲此僅構建了此功能。 – OneFineDay

+2

查看本文由Sidharth [** here **](http://www.siddharthrout.com/2012/08/06/vb-net-two-dot-rule-when-working-with-office-applications -2 /)解釋了這一點。使用COM對象時非常好...第一段解釋了爲什麼...... – Codexer

-1

一分劈,我發現是空的參考和垃圾收集:

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 
相關問題