我目前正在从事与Excel交互的大型C#项目。我们已经检测到一些excel文件的内存资源呈指数增长。 2或3个小时后,Excel崩溃。
我安装了ANT memory Profiler,它对于分析C#项目中的内存泄漏似乎非常好,并且看到所有的泄漏来自我从未听说过的类时,我感到非常困惑。
此链接很好地总结了我得到的结果:Memory Overflow: Having an increasing number of Microsoft.CSharp.RuntimeBinder.Semantics
该链接表示问题可能来自使用dynamic关键字。但是问题是我们在代码中没有使用此关键字。
但是我们正在使用:Microsoft.Office.Interop.Excel
,这是我们需要与Excel交互的dll。在研究了他们的代码之后,我们看到在他们的一些类中使用了这个动态关键字来定义他们的属性。稍后,我们将在代码中的多个位置使用这些相同的属性。但这意味着我们对这些属性无能为力,也无法使用最后一个链接甚至在此链接中建议的解决方案:Leak in RuntimeBinder when using "dynamic" keyword with __ComObject
例如,它在dll中的定义如下:
dynamic ActiveSheet { get; }
,我们正在像这样使用它(工作表是一个Excel.Worksheet对象):
worksheet = theWorkbook.ActiveSheet;
此外,我什至不知道问题是否出在这些动态关键字上,所以也许我正在寻找完全脱离实际解决方案的东西。
我不知道崩溃以哪种方法发生,我们正在使用线程来调用API,我们恢复的信息都放在excel单元格中。每秒多次调用该API。因此,我想一些信息在单元更新时会保留在内存中,而不是被删除。
这是ANT profiler给我的屏幕:
由于我们从不使用这些CSharp类,所以我不知道这些泄漏的根源或发生的方法,并且由于它是线程化和自动化的,因此没有用户操作可以告诉我们确切的泄漏发生时间。
我们在所有可能的地方都使用Marshal.ReleaseComObject
,但我想很容易错过一个……需要检查