我在使用WinForm程序調用Excel的COM組件的時候,也遇到了Excel進程退出的問題。這個問題很多人已經遇到,而且解決辦法也吵得很熱。 現在總結一下: 第一種方法是調用相關的組件釋放方法,然後用代碼調用垃圾收集器進行處理。這種方法比較正常,也就是說,是通過正規渠道來退出這個進程。 [csharp] public void QuitExcel(Microsoft.Office.Interop.Excel.Application application) { application.Quit(); try { System.Runtime.InteropServices.Marshal.ReleaseComObject(application); } catch (System.Exception ex) { MessageBox.Show(ex.ToString()); } finally { application = null; GC.Collect(); } } 第二種方法是強制Kill相關的Excel進程。因為第一種方法可能會跟相關的環境有關,在有的機器上能夠成功,而在某些機器上可能不會成功,所以,這時提出了一種比較尖銳的做法,那就是找到這個ExcelApplication相關的進程,然後強制殺掉。但是,這畢竟不是常規的退出某個進程的方法,不知道會不會造成內存碎片等問題,如果不是其他方式都不好用的話,不推薦使用 [csharp] [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID); public static void Kill(Microsoft.Office.Interop.Excel.Application excel) { excel.Quit(); IntPtr t = new IntPtr(excel.Hwnd); int k = 0; GetWindowThreadProcessId(t, out k); System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k); p.Kill(); } 這裡還有一點要提出的是,如果調用的COM組件所依附的應用程序退出的話,不管有沒有對Excel進程進行額外的處理,這個Excel進程都會退出的。比如說,我使用的是WinForm程序調用的COM組件。現在我處理完Excel後,並沒有處理Excel進程,而是直接點右上角的X關閉這個應用程序,那麼Excel進程也就退出了。但是需要指出的是,很多WinForm程序並不是處理完Excel就要關閉的,還要進行很多額外的其他工作,所以,就有必要處理相關的Excel進程了。而且,如果是Web程序的話,會一直運行,如果不進行處理的話,這個Excel進程會一直存在。