我正在使用C#自动化Visio中的绘图。我正在使用Microsoft.Office.Interop.Visio。当我自动绘制图形时,我正在创建7个Shape对象。当绘图完成并且功能完成后,我在诊断中注意到内存使用率不断上升。它从16MB开始,每运行2次,点击按钮创建一个图形,内存增加1MB。
阻止这种情况发生的唯一方法是使用GC.Collect()。但是从我的所有阅读中,每个人都说不要使用它。那么关闭COM对象的正确方法是什么呢?我还读到这可能是GC.Collect可以使用的罕见情况之一,但不确定。
答案 0 :(得分:0)
正确的方法是在使用完COM对象后使用Marshal.ReleaseComObject
。
是的,假设您没有使用大量COM对象,GC.Collect将在90%的时间内正常工作。但是,由于COM对象是本机资源,因此与管理资源相比,GC无法确定这些资源的生命周期。
微软有一篇文章暗示GC实际上遇到竞争状态并导致内存损坏的可能性非常低(我已经多次看到,最终结果是AccessViolation异常或.NET堆栈损坏)