杀死互操作申请流程

时间:2008-11-26 19:30:21

标签: .net vb.net excel 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

当我运行这几次时,我在任务管理器中获得了一堆EXCEL.EXE实例。我怎样才能在代码中杀死这些进程?代码中的所有代码都经过了尝试而无法正常工作。

9 个答案:

答案 0 :(得分:3)

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

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

或查看此link

答案 1 :(得分: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()。

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分: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();

答案 4 :(得分:0)

我几天前发布了一个解决方案: Killing Excel.EXE on server

与StingyJack提到的方法相同;我认识的唯一一个真正有效的人。

答案 5 :(得分:0)

使用使用块

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

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

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

答案 6 :(得分:0)

在ExcelApplication.Quit()之后添加以下代码。

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

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

答案 7 :(得分:0)

Tagore 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();
                    }
                }

答案 8 :(得分: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();