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

当在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单例缓存数据,这会导致泄漏,但你知道是否有任何方法来清理缓存等?

非常感谢!


类似的问题:

  • 内存溢出:拥有越来越多的Microsoft.CSharp.RuntimeBinder.Semantics
  • CLR类中的内存泄漏

相关链接:

  • https://connect.microsoft.com/VisualStudio/feedback/details/1925659 (由微软退休)
  • https://github.com/dotnet/roslyn/issues/2887

我的解决方案是替换:

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

有:

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

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

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

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

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