Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
内存泄漏C#RuntimeBinder(动态关键字?)_C#_Excel_Dynamic_Memory Leaks_Comobject - Fatal编程技术网

内存泄漏C#RuntimeBinder(动态关键字?)

内存泄漏C#RuntimeBinder(动态关键字?),c#,excel,dynamic,memory-leaks,comobject,C#,Excel,Dynamic,Memory Leaks,Comobject,我目前正在从事一个与Excel交互的大型C#项目。我们检测到,对于某些excel文件,内存资源呈指数增长。2或3小时后,Excel崩溃 我安装了ANT memory Profiler,它似乎可以很好地分析C#项目中的内存泄漏,但看到所有泄漏都来自我从未听说过的类,我感到非常困惑 这个链接很好地总结了我得到的结果: 该链接说,问题可能来自使用动态关键字。但问题是我们在代码中没有使用这个关键字 但是我们使用的是:Microsoft.Office.Interop.Excel,这是一个我们需要与Exce

我目前正在从事一个与Excel交互的大型C#项目。我们检测到,对于某些excel文件,内存资源呈指数增长。2或3小时后,Excel崩溃

我安装了ANT memory Profiler,它似乎可以很好地分析C#项目中的内存泄漏,但看到所有泄漏都来自我从未听说过的类,我感到非常困惑

这个链接很好地总结了我得到的结果:

该链接说,问题可能来自使用动态关键字。但问题是我们在代码中没有使用这个关键字

但是我们使用的是:
Microsoft.Office.Interop.Excel
,这是一个我们需要与Excel交互的dll。在查看了他们的代码之后,我们看到在他们的一些类中使用了这个动态关键字来定义他们的属性。后者在代码中的多个位置使用这些相同的属性。但这意味着我们对这些属性没有能力,我们不能使用上一个链接中建议的解决方案,甚至不能使用本链接中建议的解决方案:

例如,它在dll中的定义如下:

dynamic ActiveSheet { get; }
我们这样使用它(工作表是一个Excel.worksheet对象):

此外,我甚至不知道问题是否来自这些动态关键字,因此,我可能完全没有考虑真正的解决方案

编辑 我不知道崩溃是以什么方式发生的,我们使用线程调用API,我们恢复的信息放在excel单元格中。API每秒被调用多次。所以我猜当单元格被更新而不是被删除时,一些信息会保存在内存中

下面是ANT profiler提供给我的屏幕:

由于我们从未使用过这些CSharp类,我不知道这些泄漏的根源是什么,也不知道它是以什么方式发生的,而且由于它是线程化和自动化的,因此没有用户操作可以告诉我们泄漏发生的确切时间


我们在任何地方都可以使用
Marshal.ReleaseComObject
,但我想很容易漏掉一个。。。需要进行检查

您可以在发生内存泄漏的地方张贴方法吗?在崩溃前2-3小时,你能描述一下程序正在做什么吗?目前,,我认为这里没有足够的关于某个特定问题的信息来为您提供一个好的答案。您是否可以验证泄漏是由于使用了
dynamic
造成的,还是因为您没有正确释放某些Excel COM对象?请确保在完成释放所有Excel COM对象后Marshal.ReleaseComObject(…)@Michael我试图在问题中添加更多细节,希望能有所帮助。正如你所看到的,我有点迷路了myself@SymonActiveSheet只是一个例子。我们在程序中使用它一两次,但在Excel.Range类中,我们还使用了许多属性,如“公式”、“公式数组”、“合并单元格”、“计算”等,这些属性在父类中也定义为动态的。也许你是对的,我应该研究另一种不使用动态的方法,或者检查是否没有其他Excel dll,但如果我能避免它,我宁愿,这将是非常非常非常大量的工作要做,项目是巨大的
worksheet = theWorkbook.ActiveSheet;