关于.net:需要澄清答案才能正确清理Excel Interop对象

Need Clarification On Answer For Cleaning Up Excel Interop Objects Properly

关于汉斯·帕桑特对这个问题的回答…使用IDisposable清除Excel Interop对象…

他让我明白了我不需要遵循两点法则…声明所有的COM对象,这样我可以在使用完它们后通过marshal.releaseComObject释放它们。现在我明白了,我可以在Excel代码之后调用gc.collect和gc.waitForPendingFinalizer,所有对象都将被正确释放。首先,我认为这很好,并且会缩短我用C语言编写的宏的长度,但是我习惯于在宏运行时,一完成这些宏就释放对象,以最小化内存使用。我应该关心在执行过程中清理对象,还是像汉斯建议的那样在宏的末尾进行清理?我通常处理大型文件,我的宏将创建许多COM对象来完成一项任务。


0

作为一般规则,一旦使用完任何资源,就立即释放它。资源越贵和/或稀缺,就越重要。数据库连接、内存、文件句柄等都是如此。

它也适用于对COM对象的引用。

说了这些,表演

1
2
GC.Collect();
GC.WaitForPendingFinalizers();

这是一个明智的做法,以便在可行的清理过程中尽快发布任何引用。

有一个相反的论点需要提出,你可以运用常识和观察你自己的情况。你最终会写更多的代码来清理每一个COM引用。如果在达到可以清理的程度之前没有创建过多的COM对象,那么可能需要选择更简单的代码(例如使用双点),因为您暂时消耗的资源比绝对需要的要多。