当在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单例缓存数据并导致泄漏,但是你知道是否有任何方法来清理缓存等。
非常感谢!
类似的问题:
相关链接:
答案 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;
}