杀死一个interop应用程序进程

我有一个程序(用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 

当我运行这个几次时,我在任务pipe理器中得到了一堆EXCEL.EXE实例。 我怎样才能杀死代码中的这些进程? 代码中的所有代码都已经尝试过,并没有工作。

我不得不在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()。

现在可能有更好的方法,但这应该工作。

循环下面的代码行,直到结果为零或更less

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

或查看此链接

为了使Excel退出,您需要调用Application.Quit,并使用以下技巧之一。

  • 在实例化的每个Excel对象上调用Marshal.ReleaseComObject。 有一个知识库文章 ,介绍如何做到这一点。 例如,在您的示例代码中,“eApp.Workbooks.Open”将实例化一个Workbooks对象,而不向其分配variables。 您需要按照知识库文章中所述分配variables,以便随后可以释放它。 但是,除了最简单的自动化场景之外,很难确定你总是在所有代码path中释放所有这样的对象(例如,通过使用try / finally来确保当抛出exception时它们被释放)。

  • 在释放最后一个Excel对象后调用GC.Collect和GC.WaitForPendingFinalizers。 有人build议你可能需要这样做两次。

启动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(); 

我几天前发布了一个解决scheme: 在服务器上杀死Excel.EXE

与StingyJack提到的方法相同; 我知道的唯一一个真正的工作。

使用使用块

 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 

类似try / finally块在finally中的处理,这将自动处理Excel.Application和Excel.Workbook。

正如在其他文章中提到的,System.Runtime.InteropServices.Marshal.ReleaseComObject(eApp)也可能是必要的?

ExcelApplication.Quit()之后添加下面的代码。

它会从进程中杀死excel应用程序。

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

泰戈尔Peethala解决scheme是直接和有效的。 基本上确保WorkBook.CLOSE ..然后ExcelApplication.QUIT …然后只要find一个没有打开和closures的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(); } } 
 //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();