2008-11-26 66 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(); 
相关问题