1. 程式人生 > >C#呼叫COM元件後退出Excel程序

C#呼叫COM元件後退出Excel程序

我在使用WinForm程式呼叫Excel的COM元件的時候,也遇到了Excel程序退出的問題。這個問題很多人已經遇到,而且解決辦法也吵得很熱。
現在總結一下:
第一種方法是呼叫相關的元件釋放方法,然後用程式碼呼叫垃圾收集器進行處理。這種方法比較正常,也就是說,是通過正規渠道來退出這個程序。
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相關的程序,然後強制殺掉。但是,這畢竟不是常規的退出某個程序的方法,不知道會不會造成記憶體碎片等問題,如果不是其他方式都不好用的話,不推薦使用
[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程序會一直存在。