Leak in RuntimeBinder when using “dynamic” keyword with __ComObject

人走茶凉 提交于 2019-12-19 03:41:32

问题


Does anybody know if there is a way of preventing a memory leak in RuntimeBinder when using "dynamic" keyword with __ComObject instances in C#?

I got the following code:

var t = Type.GetTypeFromCLSID(new Guid("BB06C0E4-D293-4f75-8A90-CB05B6477EEE"));
while (true)
{
    dynamic o = System.Activator.CreateInstance(t);
    Marshal.ReleaseComObject(o);
}

This leaks LocalVariableSymbol class instances (and other from the Microsoft.CSharp.RuntimeBinder.Semantics namespace).

Replacing "dynamic" with "object" i.e.:

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

fixes the leak but I'd prefer to keep using dynamic (the actual code is much more complex and makes use of "dynamic").

I know the RuntimeBinder singleton caches the data and this causes the leak but do you know if there's any way to cleanup the cache etc.?

Many thanks!


Similar questions:

  • Memory Overflow: Having an increasing number of Microsoft.CSharp.RuntimeBinder.Semantics
  • Memory leak in CLR classes

Related links:

  • https://connect.microsoft.com/VisualStudio/feedback/details/1925659 (retired by Microsoft)
  • https://github.com/dotnet/roslyn/issues/2887

回答1:


The solution in my case was to replace:

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

with:

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

The memory leak no longer occurs having the workaround applied.




回答2:


I had a similar problem: Using "dynamic" caused a memory leak.

I solved this in the following way:

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


来源:https://stackoverflow.com/questions/33259334/leak-in-runtimebinder-when-using-dynamic-keyword-with-comobject

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!