使用带有__ComObject的“dynamic”关键字时,在RuntimeBinder中泄漏

时间:2015-10-21 12:28:12

标签: c# dynamic memory-leaks comobject

当在C#中使用带有__ComObject实例的“dynamic”关键字时,有没有人知道是否有办法防止RuntimeBinder中的内存泄漏?

我收到了以下代码:

var t = Type.GetTypeFromCLSID(new Guid("BB06C0E4-D293-4f75-8A90-CB05B6477EEE"));
while (true)
{
    dynamic o = System.Activator.CreateInstance(t);
    Marshal.ReleaseComObject(o);
}

这会泄漏LocalVariableSymbol类实例(以及Microsoft.CSharp.RuntimeBinder.Semantics命名空间中的其他实例)。

用“对象”取代“动态”,即:

    object o = System.Activator.CreateInstance(t);

修复了泄漏,但我更喜欢继续使用动态(实际代码更加复杂并且使用“动态”)。

我知道RuntimeBinder单例缓存数据并导致泄漏,但是你知道是否有任何方法来清理缓存等。

非常感谢!

类似的问题:

相关链接:

2 个答案:

答案 0 :(得分:4)

我的案例中的解决方案是替换:

dynamic o = System.Activator.CreateInstance(t);

使用:

object o = System.Activator.CreateInstance(t);
dynamic d = o;

应用变通方法后不再发生内存泄漏。

答案 1 :(得分:-2)

我遇到了类似的问题:使用“动态”导致内存泄漏。

我通过以下方式解决了这个问题:

using (dynamic attr = curve.Attributes)
{
  if (attr != null)
    return attr.InternalLabel;
}