C#呼叫COM元件後退出Excel程序
阿新 • • 發佈:2019-02-14
我在使用WinForm程式呼叫Excel的COM元件的時候,也遇到了Excel程序退出的問題。這個問題很多人已經遇到,而且解決辦法也吵得很熱。
現在總結一下:
第一種方法是呼叫相關的元件釋放方法,然後用程式碼呼叫垃圾收集器進行處理。這種方法比較正常,也就是說,是通過正規渠道來退出這個程序。
第二種方法是強制Kill相關的Excel程序。因為第一種方法可能會跟相關的環境有關,在有的機器上能夠成功,而在某些機器上可能不會成功,所以,這時提出了一種比較尖銳的做法,那就是找到這個ExcelApplication相關的程序,然後強制殺掉。但是,這畢竟不是常規的退出某個程序的方法,不知道會不會造成記憶體碎片等問題,如果不是其他方式都不好用的話,不推薦使用
現在總結一下:
第一種方法是呼叫相關的元件釋放方法,然後用程式碼呼叫垃圾收集器進行處理。這種方法比較正常,也就是說,是通過正規渠道來退出這個程序。
public void QuitExcel(ref 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相關的程序,然後強制殺掉。但是,這畢竟不是常規的退出某個程序的方法,不知道會不會造成記憶體碎片等問題,如果不是其他方式都不好用的話,不推薦使用
這裡還有一點要提出的是,如果呼叫的COM元件所依附的應用程式退出的話,不管有沒有對Excel程序進行額外的處理,這個Excel程序都會退出的。比如說,我使用的是WinForm程式呼叫的COM元件。現在我處理完Excel後,並沒有處理Excel程序,而是直接點右上角的X關閉這個應用程式,那麼Excel程序也就退出了。但是需要指出的是,很多WinForm程式並不是處理完Excel就要關閉的,還要進行很多額外的其他工作,所以,就有必要處理相關的Excel程序了。而且,如果是Web程式的話,會一直執行,如果不進行處理的話,這個Excel程序會一直存在。[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(); }