C# 使用“RuntimeBinder”时出现泄漏;“动态”;带有_ComObject的关键字
有人知道在C#中使用带有_ComObject实例的“dynamic”关键字时,RuntimeBinder中是否有防止内存泄漏的方法吗 我得到了以下代码:C# 使用“RuntimeBinder”时出现泄漏;“动态”;带有_ComObject的关键字,c#,dynamic,memory-leaks,comobject,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.ReleaseComObj
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命名空间中的其他实例)
将“动态”替换为“对象”,即:
修复了漏洞,但我更愿意继续使用dynamic(实际代码要复杂得多,并且使用了“dynamic”)
我知道RuntimeBinder singleton会缓存数据,这会导致泄漏,但您知道是否有任何方法可以清理缓存等
非常感谢
类似问题:
- (微软退休)
- 我的解决方案是替换:
dynamic o = System.Activator.CreateInstance(t);
与:
应用解决方法后,内存泄漏不再发生。我遇到了类似的问题:使用“动态”导致内存泄漏 我用以下方法解决了这个问题:
using (dynamic attr = curve.Attributes)
{
if (attr != null)
return attr.InternalLabel;
}
我还在Microsoft Connect上对此提出了质疑:您找到其他解决方案了吗?我无法使用对象类型不幸的是,我没有得到关于这个雪人的消息。我想我已经找到了一种在没有内存泄漏的情况下使用“dynamic”关键字的方法:“object o=Systen,Activator.CreateInstance(t);dynamic d=o;”然后像往常一样使用d。我已经用内存探查器检查过了,它不再报告泄漏。我会尝试,但在我的情况下,我没有任何对CreateInstance的调用,我只有类型为Dynamic的公共静态字段。所以我不知道该把这个额外的步骤放在哪里,谢谢Robert,但是它对我来说不起作用,因为u ComObject没有实现IDisposable。这确实有效!在我知道的一个例子中,将方法签名从
voidfoo(dynamicx){…}
更改为voidfoo(objectx){dynamicy=x;..}
,成功了。
object o = System.Activator.CreateInstance(t);
dynamic d = o;
using (dynamic attr = curve.Attributes)
{
if (attr != null)
return attr.InternalLabel;
}