我看过很多关于如何确保 Excel 在您想要的时候真正退出并且该过程不会继续存在的文章和问题。这是描述问题和 Microsoft 推荐的解决方案的知识库文章。本质上:
'close files
'Quit Excel
xlApp.quit()
'Release and collect garbage
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlApp)
GC.Collect()
GC.WaitForPendingFinalizers()
很多人不建议杀掉进程;请参阅 如何正确清理 Excel 互操作对象 和了解 .net 中的垃圾收集
另一方面,很多人不推荐使用 GC.Collect。请参阅使用 GC.Collect() 有什么问题?
根据我的经验,终止该过程是确保 Excel 消失的最快和最简单的方法。我的代码只杀死它启动的确切进程,没有其他。我确保关闭所有打开的工作簿,退出应用程序并释放 xlApp 对象。最后,我检查该进程是否仍然存在,如果存在,则将其杀死。
<System.Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True)> _
Private Shared Function GetWindowThreadProcessId(ByVal hWnd As IntPtr, _
ByRef lpdwProcessId As Integer) As Integer
End Function
Sub testKill()
'start the application
Dim xlApp As Object = CreateObject("Excel.Application")
'do some work with Excel
'close any open files
'get the window handle
Dim xlHWND As Integer = xlApp.hwnd
'this will have the process ID after call to GetWindowThreadProcessId
Dim ProcIdXL As Integer = 0
'get the process ID
GetWindowThreadProcessId(xlHWND, ProcIdXL)
'get the process
Dim xproc As Process = Process.GetProcessById(ProcIdXL)
'Quit Excel
xlApp.quit()
'Release
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlApp)
'set to nothing
xlApp = Nothing
'kill the process if still running
If Not xproc.HasExited Then
xproc.Kill()
End If
End Sub
我看到很多人说杀死进程是不好的,但我还没有看到任何关于为什么的定性答案。特别是在确保文件已关闭之后,Excel 已退出,我们只会终止我们开始的确切进程。我的问题是杀死 Excel 进程的潜在问题是什么。对性能有影响吗?它会损害 Excel 吗?
许多人还会说,通过良好的编码,我不必终止进程。也许吧,但这并不能回答“为什么终止进程不好?”的问题。关闭文件后,退出 Excel 并释放对象;为什么绝对确定该过程已经消失会是一件坏事?
编辑:Excel退出后实际上还剩下什么?如果 Excel 可见,它似乎正常退出,从视图和任务栏中消失。Excel实际上退出了还是没有退出。在我看来,Excel 实际上确实退出了,而且我们只有一个空的进程 shell 正在运行。任何人都可以对此发表评论吗?
编辑:有趣的是我注意到通过 GC.Collect() GC.WaitForPendingFinalizers() 的 GC(又名垃圾收集)实际上会释放 Excel 退出后留下的进程 shell。这是否支持我的假设,即空进程外壳毕竟真的是垃圾?
编辑:刚刚找到一个关于这个问题的优秀网站:50 种杀死 Excel的方法