2008-11-26 73 views
4

在程序中我有以下的(寫在VB.NET):殺害互操作的應用程序

Imports Microsoft.Office.Interop.Excel 

Public Class Form1 
    Dim eApp As New Excel.Application 
    Dim w As Excel.Workbook 
    w = eApp.Workbooks.Open("path.xls", ReadOnly:=True) 
    .. Processing Code .. 
    //Attempts at killing the excel application 
    w.Close() 
    eApp.Workbooks.Close() 
    eApp.Quit() 
End Class 

當我跑這幾次,我收到了一堆EXCEL.EXE實例在我任務管理器。我怎樣才能殺死代碼中的這些進程?代碼中的所有代碼都已經嘗試過,並沒有工作。

回答

3

我不得不這樣做了一段時間後在NET 1.1,所以請原諒生鏽。

在eApp上,有一個Hwind(一個win32窗口句柄 - http://msdn.microsoft.com/en-us/library/bb255823.aspx)或類似的對象。我不得不使用它和一個pInvoke(http://www.pinvoke.net/default.aspx/user32.GetWindowThreadProcessId)來獲取進程ID。通過這個,我可以在exe上執行一個Process.Kill()。

現在可能有更好的方法去做,但這應該起作用。

3

環路下面的一行代碼,直到結果等於或小於零

System.Runtime.InteropServices.Marshal.ReleaseComObject(eApp) 

或看看這個link

+0

其實我剛剛發現這一點。偉大的聯繫,順便說一句。 – 2008-11-26 19:49:41

+0

嗨,我認爲這個解決方案不會工作,如果Excel顯示模式對話框。在這種情況下,您將必須按照StingyJack 所述的方法終止Excel過程。一般來說,在自動執行以及自動重新計算時禁用警報(Application.DisplayAlerts = False)是一種很好的做法。 – 2008-11-26 19:53:06

0

我發佈了一個解決這個前幾天: Killing Excel.EXE on server

爲StingyJack相同方法提及;我知道唯一真正有效的人。

2

爲了讓Excel退出,您需要調用Application.Quit並使用以下技巧之一。在每一個Excel的

  • 調用Marshal.ReleaseComObject的對象實例化。有一個KnowledgeBase article描述如何做到這一點。例如,在您的示例代碼中,「eApp.Workbooks.Open」實例化一個Workbooks對象,而不分配變量給它。您需要按照知識庫文章中的描述分配變量,以便隨後可以釋放它。值得注意的是,除了最簡單的自動化場景之外,很難確保始終在所有代碼路徑中釋放所有這些對象(例如,通過使用try/finally來確保在拋出異常時釋放它們)。

  • 在釋放最後一個Excel對象後調用GC.Collect和GC.WaitForPendingFinalizers。有些人建議你可能需要這樣做兩次。

0

使用using塊

Using eApp As New Excel.Application 
    Using w As Excel.Workbook 
    w = eApp.Workbooks.Open("path.xls", ReadOnly:=True) 
    .. Processing Code .. 
    //Attempts at killing the excel application 
    w.Close() 
    eApp.Workbooks.Close() 
    eApp.Quit() 
    End Using 
End Using 

類似的嘗試/終於在最終處置塊,這將自動配置一個Excel.Application和Excel.Workbook。

正如其他職位所述,System.Runtime.InteropServices.Marshal.ReleaseComObject(eApp)也可能是必要的?

0

ExcelApplication.Quit()添加以下代碼後。

它會殺死進程中的excel應用程序。

  Process[] Proc = Process.GetProcessesByName("Excel"); 
      foreach (Process p in Proc) 
      { 
       if (p.MainWindowTitle == "") 
        p.Kill(); 
      } 
1

啓動Excel:

Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); 
Workbook wb = xlApp.Workbooks.Open(...); 
Worksheet ws = (Worksheet)wb.Worksheets[1]; 

殺的Excel:

System.Runtime.InteropServices.Marshal.ReleaseComObject(ws); 
System.Runtime.InteropServices.Marshal.ReleaseComObject(wb); 
wb = null; 
ws = null; 

uint idProcess; 
GetWindowThreadProcessId((IntPtr)xlApp.Hwnd, out idProcess); 

xlApp.DisplayAlerts = false; 
xlApp.Quit(); 
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp); 
xlApp = null; 
xlApp = null; 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 

Process processo = null; 
try 
{     
    processo = Process.GetProcessById((int)idProcess); 
} 
catch { } 

if (processo != null) 
    processo.Kill(); 
0

泰戈爾Peethala解決方案是直線前進和作品。基本上確保WorkBook.CLOSE ..然後ExcelApplication.QUIT ...然後找一個沒有打開並關閉它的excel運行實例。

myExcelWorksheet = null; 
if (myExcelWorkbook != null) 
       { 
        myExcelWorkbook.Close(); 
        myExcelWorkbook = null; 
       } 
       if (myExcelApp != null) 
       { 
        myExcelApp.Quit(); 
        myExcelApp = null; 
       } 
       foreach (System.Diagnostics.Process myProcess in System.Diagnostics.Process.GetProcessesByName("Excel")) 
       { 
        if (myProcess.MainWindowTitle == "") 
        { 
         myProcess.Kill(); 
        } 
       } 
0
//Quit Excel application 
eApp.Quit(); 

//Release COM objects (every object you used in eApp,like workbooks, Workbook, Sheets, Worksheet) 
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); 
obj = null; 

// Force garbage collector cleaning 
GC.Collect(); 
相關問題