栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何正确清理Excel互操作对象?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何正确清理Excel互操作对象?

Excel不会退出,因为您的应用程序仍在保留对COM对象的引用。

我猜您正在调用COM对象的至少一个成员,而没有将其分配给变量。

对我来说,这是 excelApp.Worksheets 对象,我直接使用它而不将其分配给变量:

Worksheet sheet = excelApp.Worksheets.Open(...);...Marshal.ReleaseComObject(sheet);

我不知道C#在内部为 Worksheets
COM对象创建了一个包装,而该包装没有被我的代码释放(因为我当时不知道),这就是Excel无法卸载的原因。

我在此页面上找到了解决问题的方法,该方法对于在C#中使用COM对象也有一个很好的规则:

切勿对COM对象使用两个点。


因此,基于此知识,正确的方法是:

Worksheets sheets = excelApp.Worksheets; // <-- The important partWorksheet sheet = sheets.Open(...);...Marshal.ReleaseComObject(sheets);Marshal.ReleaseComObject(sheet);

事后更新:

我希望每个读者都仔细阅读Hans
Passant的答案,因为它解释了我和许多其他开发人员所陷入的陷阱。几年前,当我写这个答案时,我不知道调试器对垃圾收集器的影响并得出错误的结论。为了历史起见,我的答案没有改变,但请阅读此链接,
不要
采用“两个点”的方式:了解.NET中的垃圾收集并使用IDisposable清理Excel
Interop对象



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/421518.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号