C#:从 Interop.Visio 个 COM 对象中释放内存

C#: Freeing memory from Interop.Visio COM objects

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

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

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

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

Microsoft 有一篇文章暗示 GC 实际上 运行 进入竞争条件并导致内存损坏的可能性很小(我已经多次看到这种情况,最终结果是 AccessViolation 异常或 .NET 堆栈损坏)