使用完excel后,如何关闭进程(C#)

      使用C#操作Excel的COM组件的过程中,最后把EXCEL进程关闭掉是十分重要的。网上有一些方法,我总结了其中两条,并测试通过。

      首先第一种是利用.net的GC,即垃圾回收器。代码如下:

ContractedBlock.gif ExpandedBlockStart.gif Code
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 using System.Runtime.InteropServices;
 5 
 6 namespace ExcelTest
 7 {
 8     class DataOutput
 9     {
10         static void Main(string[] args)
11         {
12             Excel.Application app = new Excel.ApplicationClass();
13             Excel.Workbook wBook = app.Workbooks.Add(true);
14             Excel.Worksheet wSheet = wBook.Worksheets[1as Excel.Worksheet;
15             app.Visible = true;
16 
17             System.Runtime.InteropServices.Marshal.ReleaseComObject(wSheet);
18             System.Runtime.InteropServices.Marshal.ReleaseComObject(wBook);
19             System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
20             GC.Collect();               //显式调用GC
21 
22             Console.Read();
23         }
24     }
25 }

 

      关注后面四行,System.Runtime.InteropServices.Marshal类主要提供对非受托管内存的操作。对于函数ReleaseComObject,在MSDN上的解释是“该运行库可调用包装具有引用计数,每次将 COM 接口指针映射到该运行库可调用包装时,此引用计数都将递增。ReleaseComObject 方法递减运行库可调用包装的引用计数。当引用计数达到零时,运行库将释放非托管 COM 对象上的所有引用。”即断开对对象的引用,这样GC发现对象不会再被使用,那么就会回收它。

      第二种方法是通过进程的ID号把进程kill掉。但第一种方法有网友说有时候不灵,因为本人只是简单地用控制台来测试,可能在其它情况下不一定行,所以推荐使用第二种方法。

ContractedBlock.gif ExpandedBlockStart.gif Code
 1 namespace ExcelTest
 2 {
 3     class DataOutput
 4     {
 5         static void Main(string[] args)
 6         {
 7             Excel.Application app = new Excel.ApplicationClass();
 8             Excel.Workbook wBook = app.Workbooks.Add(true);
 9             Excel.Worksheet wSheet = wBook.Worksheets[1as Excel.Worksheet;
10             app.Visible = true;
11 
12             Kill(app);
13 
14             Console.Read();
15         }
16 
17         [DllImport("User32.dll", CharSet = CharSet.Auto)]
18         public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);
19 
20         public static void Kill(Excel.Application excel)
21         {
22             IntPtr t = new IntPtr(excel.Hwnd);   //得到这个句柄,具体作用是得到这块内存入口 
23 
24             int k = 0;
25             GetWindowThreadProcessId(t, out k);   //得到本进程唯一标志k
26             System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k);   //得到对进程k的引用
27             p.Kill();     //关闭进程k
28 
29         }
30     }
31 }

 

         GetWindowThreadProcessId函数是User32.dll中函数,作用是通过对象的句柄得到对象的进程ID。extern 修饰符用于声明在外部实现的方法。明白这点后,整个过程就很简单了:其实就是先获得Excel.Application实例app的句柄,再通过句柄得到进程ID,最后把该ID的进程Kill掉。

转载于:https://www.cnblogs.com/icescut/archive/2009/07/23/1529423.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值