使用带有__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; }