关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
这次要说的内容是之前开发Excel插件碰到的一个问题,调试了很久才解决问题,总结记录。
开发VSTO插件,生成之后。新建Excel文档打开,一切正常。
;
关闭Excel文档,再重新打开一次。这时候问题来了。插件没了,没有加载。
反复测试几次,最后发现关闭Excel文档之后。还残留Excel.exe空进程。导致插件还加载在这个进程中,下次打开Excel文档时,Excel会创建新的进程。但插件已经加载了,就不会在新的Excel文档中重新加载插件。
这种现象一般是还有代码在执行,或者资源未回收。
检查关闭文档之后是否还有多线程或者代码还在执行,发现并没有。
那么很可能是资源未及时回收导致的,因为C#有自动回收机制,一般不用担心这个问题。但我在插件中有部分代码是调用COM相关和API这些的东西,若这些有残留资源在内存中,不会自动及时释放,会导致这个问题。
解决方法当然是找到会处理回收资源的地方,做回收处理。
不过这样处理有难度,因为有些代码不确定是否需要回收处理,而且很难定位到具体位置。再者,若针对每个类都写析构方法也很麻烦。
C#已经为我们提供了全部回收资源的处理。可以在插件关闭的事件执行该操作,打开ThisAddin.cs,添加引用:
using System.Runtime.InteropServices;
再找到ThisAddin的Shutdown事件,添加如下代码:
private void ThisAddIn_Shutdown(object sender, System.EventArgs e) { //强制回收资源 //有时关闭Excel文件,都残留Excel.exe空进程。导致下次打开Excel文件,没有加载插件 //有时才会,不是每次都会,说明有时可以回收资源,有时回收不了 try { GC.Collect(); Marshal.FinalReleaseComObject(Globals.ThisAddIn.Application); GC.Collect(); } catch { } }
同样,Word、PPT插件开发时,也可以添加上面的代码。
相关专题: VSTO的那些坑