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进程会一直存在。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值