【问题标题】:C#: Freeing memory from Interop.Visio COM objectsC#:从 Interop.Visio COM 对象中释放内存
【发布时间】:2017-11-20 16:53:29
【问题描述】:

我正在使用 C# 在 Visio 中自动绘图。我正在使用 Microsoft.Office.Interop.Visio。当我自动化绘图时,我正在创建 7 个 Shape 对象。当绘图完成并完成功能时,我在诊断中注意到内存使用量不断上升。它开始时为 16MB,每运行 2 次单击按钮创建绘图,内存就会增加 1MB。

阻止这种情况发生的唯一方法是使用 GC.Collect()。但从我所有的阅读来看,每个人都说不要使用它。那么关闭 COM 对象的正确方法是什么?我还读到这可能是 GC.Collect 可以使用的罕见实例之一,但不确定。

【问题讨论】:

  • 是的,这正是 GC.Collect() 所针对的场景。您的程序只是没有对 GC 堆施加足够的压力来触发正常的收集。
  • 很高兴听到其他人同意这一点。

标签: c# com garbage-collection visio


【解决方案1】:

正确的方法是在使用完 COM 对象后使用Marshal.ReleaseComObject

是的,假设您不使用大量 COM 对象,GC.Collect 将在 90% 的时间里正常工作。但是由于 COM 对象是本机资源,与托管资源相比,GC 无法很好地确定这些资源的生命周期。

Microsoft 有一篇文章暗示 GC 实际上会遇到竞争条件并导致内存损坏的可能性非常低(我见过很多次,最终结果是 AccessViolation 异常或 .NET 堆栈损坏)

【讨论】:

  • 我尝试使用 ReleaseComObject 但内存仍在堆积。也许如果我将这些形状对象也设置为空? (注意:不是我否决了你)
  • @jediderek 你需要释放你获得的每一个 COM 对象。包括作为返回类型的一个,事件处理程序中的一个。永远不要使用像 x.y.z 这样的两个点,因为 y 可能是一个 com 对象也需要免费
猜你喜欢
  • 1970-01-01
  • 2010-11-06
  • 2012-03-05
  • 2018-06-15
  • 2015-09-25
  • 2012-09-17
  • 2015-07-09
  • 1970-01-01
相关资源
最近更新 更多