程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#調用COM組件後退出Excel進程

C#調用COM組件後退出Excel進程

編輯:C#入門知識

我在使用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進程會一直存在。  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved