VSTO的Excel对象模型提供了托管代码对Excel的操作。但是它的实现时通过RCW(Runtime Com Wrapper)实现的,所以无法完全按照托管代码的运行方式操作。COM的资源释放时通过引用计数的方式实现,不同于CLR的GC机制,在引用计数没有设置为0的情况下,是不会回收资源的。所以,很多情况下,在操作Excel的时候,进程无法结束,其实就是因为Excel的COM计数器没有置0.

那么,如何才能正确地将计数器置0呢?简单代码如下。

            //启动Excel的程序
Excel.Application app = new Excel.Application(); //获取Excel的所有工作簿,注意,不可以使用.net级联方式,即如app.Workbooks.Add()
//必须每个变量都设置引用,这样才可以逐个释放变量,切记,重中之重
Excel.Workbooks wbs = app.Workbooks;
//获取一个工作簿
Excel.Workbook wb = wbs.Add();
//获取当前工作表
Excel.Worksheet ws = wb.ActiveSheet; //声明一个表示Excel区域的变量,并利用其对Excel进行操作
Excel.Range rng;
rng = ws.Range["A1"];
rng.Value2 = "Hello";
//将该变量引用的Com对象的计数器设置为0,并设置引用为null,释放对象
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(rng);
rng = null;
//同上
rng = ws.Range["A2"];
rng.Value2 = "Again";
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(rng);
rng = null; //释放工作表
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(ws);
ws = null; //释放工作簿集合
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(wbs);
wbs = null; //保存文档
wb.SaveAs(@"d:\hello.xlsx"); //释放工作簿
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(wb);
wb = null; //通知Excel主机退出程序
app.Quit(); //最后,释放Excel主机的引用计数器
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(app);
app = null;

如此,进程中的Excel将自动退出,我们也就避免强制结束进程带来的Excel报错问题。

这里的要点就是:任何一个Com对象的引用在指向其他对象之前必须显示释放其对该Com的引用。最后,释放所有的Excel对象的引用计数!

关于VSTO调用Excel后进程无法退出的解决方案:的更多相关文章

  1. wxPython 对话框关闭后进程无法退出的原因

    wxPython中不要用对话框作为主程序wx.Dialog,这会导致程序关闭后进程无法退出.一种可行的做法是用wx.Frame代替

  2. 解决C#使用Microsoft.Office.Interop.Excel操作Excel后进程一直存在的问题

    This resolved the issue for me. Your code becomes: public Excel.Application excelApp = new Excel.App ...

  3. 解决在IIS中调用Microsoft Office Excel组件后进程无法正常退出的问题

    来源:http://www.cnblogs.com/ahui/archive/2013/03/05/2944441.html 有一个项目用到Excel组件产生报表,本以为这个通用功能是个很简单的cas ...

  4. C#导出Excel后关闭进程EXCEL.EXE

    在C#中使用Microsoft.Office.Interop.Execl 导出excel 表格时,将以下两个属性亩后,在导完后, Excel.exe 进程无法关闭. // excel app 是否可见 ...

  5. 使用脚本调用maven命令后脚本直接退出问题

    在带有maven命令的bat脚本执行的时候,执行完一个mvn 目标后会自动退出,pause命令也无效. 原因:mvn本身是一个bat命令,因此在exit退出的时候,整个脚本进程将退出,加入call命令 ...

  6. Windows批处理 调用程序后 不等待子进程 父进程继续执行命令

    从DOS过来的老鸟应该都知道批处理,这个功能在WINDOWS中仍然保留着.批处理 说白了就是把一系列DOS命令写在一个文本文件里,然后把这个文件命名为XXX.bat(WINXP以后的系统也可以命名为* ...

  7. 由STL map调用clear后,内存不返还给操作系统的问题出发,探讨glibc malloc/free行为(转)

    1. 问题 我们的程序有几十个线程,每个线程拥有一个std::map,每个线程都要向自己的std::map中插入大量的数据,但每个数据只有几十字节:当使用完std::map,调用map.clear() ...

  8. 【转载】详解CreateProcess调用内核创建进程的过程

    原文:详解CreateProcess调用内核创建进程的过程 昨天同学接到了腾讯的电面,有一题问到了CreateProcess创建进程的具体实现过程,他答得不怎么好吧应该是, 为了以防万一,也为了深入学 ...

  9. 是什么在.NET程序关闭时阻碍进程的退出?

    在平时使用软件或是.NET程序开发的过程中,我们有时会遇到程序关闭后但进程却没有退出的情况,这往往预示着代码中有问题存在,不能正确的在程序退出时停止代码执行和销毁资源.这个现象有时并不容易被察觉,但在 ...

随机推荐

  1. Linux系统中CPU使用率查询常用的5个命令

    在程序开发中,我们一般都是在Linux系统上进行开发,因此对Linux系统的维护工作很重要.在Linux系统维护中,我们需要经常查看的就是cpu的使用率,分析系统的整体运行情况.那CPU使用率怎么查询 ...

  2. 在Unicode版Inno Setup中使用ISSkin

    ISSkin是Code jock 公司出品的Inno Setup 皮肤插件,用于为Inno制作的安装程序提供皮肤功能. 自Delphi发布2009之后,Inno Setup 开始出现支持Unicode ...

  3. 利用同一 ASP.NET 的多个代码框架

    2012 年,Microsoft 推出了两个添加到 ASP.NET 工具包的新框架:Web API 和 SignalR. 这两个框架为开发环境带来独特的开发方式,每个框架都有自身的独特之处: Web ...

  4. Android——BitMap(位图)相关知识总结贴

    Android中文API(136) —— Bitmap http://www.apkbus.com/android-54644-1-1.html Android 4.0 r1 API—Bitmap(S ...

  5. Python LDAP中的时间戳转换为Linux下时间

    (Get-ADUser zhangsan -Properties badpasswordtime).badpasswordtime返回值为:131172610187388712131172610187 ...

  6. MySQL执行计划中key_len详解

    (1).索引字段的附加信息:可以分为变长和定长数据类型讨论,当索引字段为定长数据类型,比如char,int,datetime,需要有是否为空的标记,这个标记需要占用1个字节:对于变长数据类型,比如:v ...

  7. 发布订阅 - 基于A2DFramework的事件机制实现

    SUMMARY 能做什么 DEMO 原理图 应用场景 能做什么 A2DFramework的事件机制是基于发布订阅模式改进得来的一套API,中间件部分实现了msmq.redis.Supersocket可 ...

  8. Form 表单中的Input元素回车时不保存表单

    在Form表单中如果直接在Input元素里敲回车键,那么默认将提交表单,可以通过keydown事件取消默认此操作 $("form").live('keydown',function ...

  9. ip校验方法:判断ip是否位于指定的范围内

    import java.util.ArrayList;import java.util.List;import java.util.regex.Matcher;import java.util.reg ...

  10. VC++ 学习笔记(三):摩登之路——C++/CLI简介

    在Windows上,除非我们必须得用C++来写界面,否则我会选择避免,避免学习和使用MFC.替代的方案是用C#来做界面,然后用C++/CLI来连接C#和Native C++.那么问题来了,C++/CL ...