Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用“RuntimeBinder”时出现泄漏;“动态”;带有_ComObject的关键字_C#_Dynamic_Memory Leaks_Comobject - Fatal编程技术网

C# 使用“RuntimeBinder”时出现泄漏;“动态”;带有_ComObject的关键字

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

有人知道在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命名空间中的其他实例)

将“动态”替换为“对象”,即:

修复了漏洞,但我更愿意继续使用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;
      }